[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):
  fmt=QtOpenGL.QGLFormat()
  fmt.setDoubleBuffer(True)
  #fmt.setSampleBuffers(True)
  fmt.setDepth(1)
  QtOpenGL.QGLWidget.__init__(self,fmt)
  EMEventRerouter.__init__(self,em_image_2d_module) # makes self.target
  self.initimageflag = True

  self.setFocusPolicy(Qt.StrongFocus)
  self.setMouseTracking(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)
  else:
   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):
  try:
   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?



Thanks.

Grant 




More information about the PyQt mailing list