[PyQt] Re: no response for mouse event in PyQt4 4.5.4

Grant Tang tang_guang at hotmail.com
Wed Sep 2 15:07:54 BST 2009

"Hans-Peter Jansen" <hpj at urpla.net> wrote in message 
news:200909010902.06605.hpj at urpla.net...
> Am Dienstag, 1. September 2009 schrieb Grant Tang:
>> Hi,
>> We have an software EMAN2 which choose PyQt4 to implement the GUI
>> interface. Which works fine until recently I upgrade my PyQt4 to 4.5.4.
>> After the upgrading, I lose response to all mouse event, including mouse
>> clicking on a 2D/3D image and mouse wheel (I use wheel to zoom in or out
>> of image). I tried PyQt4 4.5.2, still no response for all mouse event.
>> The mouse works perfectly fine for PyQt4 4.4.4. I doubt all 4.5 versions
>> will not work. Could somebody help?
>> I post some pieces of code for my mouse wheel event, hope it help:
>> class Main2DWindowEventHandler(BoxEventsHandler):
>>     def __connect_Signals_to_slots(self):
>>         QtCore.QObject.connect(self.main_2d_window.emitter(),
>> QtCore.SIGNAL('mousewheel'), self.mouse_wheel())
>                                               ^^
> This looks wrong: calling the function, instead of leaving a reference,
> while mouse_wheel() does not look like returning any callable.
>> class EMImage2DEmitMouseMode(EMImage2DMouseEvents):
>>     def mouse_wheel(self, event):
>>         seld.mediator.emit(QtCore.SIGNAL('mousewheel'), event)
>          ^^^^
>          self?
>> #actual slot function
>> class EMImage2DModule(EMGUIModule):
>>     def weelEvent(self, event):
>          ^^^^^^^^^
>          wheelEvent?
>>         #blah, blah
>> I tried to print out message in this slot function. It prints out in
>> PyQt4.4.4 but nothing got printed in PyQt4.5.*.
>> Since it works fine with PyQt4 4.4.4 and previous versions. I doubt
>> something new in 4.5.* make it not work.
> If PyQt 4.5 events wouldn't work, guess how many complaints would arrive?
> This is all so basic, that I doubt, the problem is in PyQt.
> Please provide  a minimum self-containing example of your issue.
> Pete

Sorry for the typos. We found out the error source and fixed it. But I still 
need help to understand why.

We have this class defined:

#code 1, works in PyQt4.4.4. mouse event no reponse in PyQt 4.5.4

class EMImage2DWidget(QtOpenGL.QGLWidget, EMEventRerouter):

After we swiched the order of the inheritance, mouse works in PyQt.4.5.4:

#code 2, works fine in PyQt 4.5.4

class EMImage2DWidget(EMEventRerouter, QtOpenGL.QGLWidget):

The __init__ function for class EMImage2DWidget:


class EMImage2DWidget(QtOpenGL.QGLWidget,EMEventRerouter):
 def __init__(self, em_image_2d_module):
  EMEventRerouter.__init__(self,em_image_2d_module) # makes self.target
  self.initimageflag = True


The code for EMEventRerouter:


class EMEventRerouter:
 def __init__(self,target=None):
  if target != None:
   self.target = weakref.ref(target)
   self.orig_target  = weakref.ref(target)
   self.target = None
   self.orig_target = None
  self.selected_object = None
  self.multi_selected_objects = [] # as grown using "ctrl-click"
selection, for event master slave relationships

 def lock_target(self,target):
  self.target = target

 def unlock_target(self):
  self.target = self.orig_target # will this work in the weak ref approach 

 def set_target(self,target):
  self.target = weakref.ref(target)
  self.orig_target  = weakref.ref(target)
#  self.target = target
#  self.orig_target  = target

 def mousePressEvent(self, event):
  if self.target != None: self.target().mousePressEvent(event)

 def wheelEvent(self,event):
  if self.target != None: self.target().wheelEvent(event)

 def mouseMoveEvent(self,event):
  if self.target != None: self.target().mouseMoveEvent(event)

 def mouseReleaseEvent(self,event):
  if self.target != None: self.target().mouseReleaseEvent(event)

 def mouseDoubleClickEvent(self,event):
  if self.target != None: self.target().mouseDoubleClickEvent(event)

 def keyPressEvent(self,event):
  if self.target != None: self.target().keyPressEvent(event)

 def dropEvent(self,event):
  if self.target != None: self.target().dropEvent(event)

 def closeEvent(self,event) :
  if self.target != None: self.target().closeEvent(event)

 def dragEnterEvent(self,event):
  if self.target != None: self.target().dragEnterEvent(event)

 def keyPressEvent(self,event):
  if self.target != None: self.target().keyPressEvent(event)

 def leaveEvent(self,event):
   if self.target != None: self.target().leaveEvent(event)
  except: print "leave failed"
 def get_core_object(self):
  if self.target == None: return None
  else: return self.target()

 def get_target(self):
  if self.target == None: return None
  else: return self.target() # use this one instead of the above

We use EMEventRerouter to handle all mouse and keyboard event.

The situation is code1 works for PyQt 4.4.4. We have to change to code2 to 
make mouse event works. In the ___init__ function, the 
self.setMouseTracking(True) or self.setMouseTracking(False) doesn't matter 
in PyQt 4.5.4.

Can sombody explain this to me?



More information about the PyQt mailing list