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

Phil Thompson phil at riverbankcomputing.com
Wed Sep 2 15:18:00 BST 2009


On Wed, 2 Sep 2009 09:07:54 -0500, "Grant Tang" <tang_guang at hotmail.com>
wrote:
> "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?

It's a SIP regression affecting mixins that has been fixed in current
snapshots.

Phil


More information about the PyQt mailing list