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
, the way in the tutorial often goes in the way that we create a new class inherited from QLabel. But can I just use a lambda expression to handel the event without inheritance just like
ql = QLabel()
ql.mouseMoveEvent = lambda e : print e.x(), e.y()
So I do not need to write a whole class and just use simple lambda expression to implement some simple event.
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, QtCoreclass 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 andsource 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 sysapp = QtGui.QApplication(sys.argv)window = Window()window.show()window.resize(200, 100)sys.exit(app.exec_())