PyQt:如何在不继承的情况下处理事件

2024-06-16 14:58:05 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在不继承的情况下处理鼠标事件,用例描述如下:

假设我想让QLabel对象handelMouseMoveEvent,本教程中的方法通常是创建一个继承自QLabel的新类。但是我能不能用lambda表达式来处理事件而不继承,就像

ql = QLabel()
ql.mouseMoveEvent = lambda e : print e.x(), e.y()

所以我不需要编写整个类,只需要使用简单的lambda表达式来实现一些简单的事件。


Tags: 对象方法lambda表达式事件情况教程鼠标
2条回答

是的,您可以这样做,但是在python2中,您不能在lambda中使用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_())

相关问题 更多 >