[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