2024-06-16 14:58:05 发布
网友
如何在不继承的情况下处理鼠标事件,用例描述如下:
假设我想让QLabel对象handelMouseMoveEvent,本教程中的方法通常是创建一个继承自QLabel的新类。但是我能不能用lambda表达式来处理事件而不继承,就像
MouseMoveEvent
ql = QLabel() ql.mouseMoveEvent = lambda e : print e.x(), e.y()
所以我不需要编写整个类,只需要使用简单的lambda表达式来实现一些简单的事件。
是的,您可以这样做,但是在python2中,您不能在lambda中使用print,因为它是一个语句,而不是一个函数,并且不返回值。
print
试试这个:
ql = QLabel() def event_handler(e): print e.x(), e.y() ql.mouseMoveEvent = event_handler
最灵活的方法是安装可以代表对象接收事件的event filter:
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中,您不能在lambda中使用
print
,因为它是一个语句,而不是一个函数,并且不返回值。试试这个:
最灵活的方法是安装可以代表对象接收事件的event filter:
相关问题 更多 >
编程相关推荐