6

継承なしでマウスイベントを処理するにはどうすればよいですか。ユースケースは次のように説明できます。

QLabelオブジェクトを処理させたいとするとMouseMoveEvent、チュートリアルの方法は、QLabelから継承された新しいクラスを作成する方法とよく似ています。しかし、ラムダ式を使用して、継承せずにイベントを処理することはできますか?

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

したがって、クラス全体を作成する必要はなく、単純なラムダ式を使用して単純なイベントを実装するだけです。

4

2 に答える 2

13

これを行う最も柔軟な方法は、オブジェクトに代わってイベントを受信できるイベント フィルターをインストールすることです。

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_())
于 2012-12-09T16:59:32.167 に答える
3

はい、これを行うことができますが、python2 ではprintラムダで使用できません。関数ではなくステートメントであり、値を返さないためです。

これを試して:

ql = QLabel()
def event_handler(e):
    print e.x(), e.y()
ql.mouseMoveEvent = event_handler
于 2012-12-09T16:54:11.547 に答える