Issue
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.
Solution
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_())
Answered By - ekhumoro
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.