[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