Python PyQt:如何在没有继承的情况下处理事件
如何在没有继承的情况下处理鼠标事件,用例描述如下: 假设我想让QLabel对象处理成handelPython PyQt:如何在没有继承的情况下处理事件,python,events,pyqt,pyqt4,handler,Python,Events,Pyqt,Pyqt4,Handler,如何在没有继承的情况下处理鼠标事件,用例描述如下: 假设我想让QLabel对象处理成handelMouseMoveEvent,教程中的方法通常是创建一个继承自QLabel的新类。但是,我可以只使用lambda表达式来处理事件而不进行继承吗 ql = QLabel() ql.mouseMoveEvent = lambda e : print e.x(), e.y() 所以我不需要编写一个完整的类,只需要使用简单的lambda表达式来实现一些简单的事件。是的,您可以这样做,但在python2中,您
MouseMoveEvent
,教程中的方法通常是创建一个继承自QLabel的新类。但是,我可以只使用lambda表达式来处理事件而不进行继承吗
ql = QLabel()
ql.mouseMoveEvent = lambda e : print e.x(), e.y()
所以我不需要编写一个完整的类,只需要使用简单的lambda表达式来实现一些简单的事件。是的,您可以这样做,但在python2中,您不能在lambda中使用
print
,因为它是一个语句而不是函数,并且不返回值
试试这个:
ql = QLabel()
def event_handler(e):
print e.x(), e.y()
ql.mouseMoveEvent = event_handler
最灵活的方法是安装可以代表对象接收事件的:
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_())
print
是python3中的一个函数,来自uuu future\uuuu导入print\u函数
@X.Jacobs-当然,但从他的打印语法来看,我认为他使用的是python2。当然,将来的导入也是python2.6+的解决方案。尤其是installEventFilter(self)