PyQt: how to handle event without inheritance

后端 未结 2 1157
别那么骄傲
别那么骄傲 2021-02-04 18:15

How can I handle mouse event without a inheritance, the usecase can be described as follows:

Suppose that I wanna let the QLabel object to handel MouseMoveEvent

相关标签:
2条回答
  • 2021-02-04 18:43

    The most flexible way to do this is to install an event filter that can receive events on behalf of the object:

    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_())
    
    0 讨论(0)
  • 2021-02-04 18:53

    Yes you can do this, but in python2 you can't use print in your lambda, as it's a statement and not a function and does not return a value.

    Try this:

    ql = QLabel()
    def event_handler(e):
        print e.x(), e.y()
    ql.mouseMoveEvent = event_handler
    
    0 讨论(0)
提交回复
热议问题