我该如何处理鼠标事件没有遗传,用例可以描述如下:
假设我想就让QLabel对象韩德尔MouseMoveEvent
,在本教程的方式经常去的,我们创建QLabel继承了一类新的途径。 但我只是用lambda表达式没有继承就好像到韩德尔事件
ql = QLabel()
ql.mouseMoveEvent = lambda e : print e.x(), e.y()
所以,我并不需要写一整类,只需使用简单的lambda表达式实现一些简单的事件。
我该如何处理鼠标事件没有遗传,用例可以描述如下:
假设我想就让QLabel对象韩德尔MouseMoveEvent
,在本教程的方式经常去的,我们创建QLabel继承了一类新的途径。 但我只是用lambda表达式没有继承就好像到韩德尔事件
ql = QLabel()
ql.mouseMoveEvent = lambda e : print e.x(), e.y()
所以,我并不需要写一整类,只需使用简单的lambda表达式实现一些简单的事件。
最灵活的方式做,这是安装一个事件过滤器 ,可以代表对象的接收事件:
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.label = QtGui.QLabel(self)
self.label.setText('Hello World')
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
self.label.setMouseTracking(True)
self.label.installEventFilter(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.label)
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.MouseMove and
source is self.label):
pos = event.pos()
print('mouse move: (%d, %d)' % (pos.x(), pos.y()))
return QtGui.QWidget.eventFilter(self, source, event)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
window.resize(200, 100)
sys.exit(app.exec_())
是的,你可以做到这一点,但在python2不能使用print
在您的拉姆达,因为它是一个声明,而不是一个功能,并且不返回值。
试试这个:
ql = QLabel()
def event_handler(e):
print e.x(), e.y()
ql.mouseMoveEvent = event_handler