0

マウスイベントをシーンにアタッチする方法が見つかりません。[表示]を使用しない場合、すべてのイベントがキャプチャされますが、コメントアウトすると、mousePressEventのみが機能します。助けてください。

from PySide import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.Scene()
        self.View()

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print "Pressed!!!"

    def mouseMoveEvent(self, event):
        print "moving....."

    def mouseReleaseEvent(self, event):
        print "-------released"

    def Scene(self):
        self.s = QtGui.QGraphicsScene(self)

    def View(self):
        self.v = QtGui.QGraphicsView(self.s)
        self.setCentralWidget(self.v)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(300, 200)
    window.show()
    sys.exit(app.exec_())
4

1 に答える 1

4

Qtでは、イベントは子から親に処理されます。最初に子供はイベントを受け取ります。次に、イベントを処理するかどうかを決定します。それに基づいて行動したくない場合はignore、イベントを実行でき、イベントは親に渡されます。

セットアップではQMainWindow、親として、およびQGraphicsViewその子としてがあります。のすべてのイベントはQGraphicsView、最初のイベントによって処理されQGraphicsViewます。イベントが不要な場合は、イベントを実行しignoreてに渡しQMainWindowます。

それをよりよく視覚化するには、そのsをサブクラス化してQGraphicsViewオーバーライドします。mouse*Event

from PySide import QtGui, QtCore

class View(QtGui.QGraphicsView):
    def mousePressEvent(self, event):
        print "QGraphicsView mousePress"

    def mouseMoveEvent(self, event):
        print "QGraphicsView mouseMove"

    def mouseReleaseEvent(self, event):
        print "QGraphicsView mouseRelease"

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.Scene()
        self.View()

    def mousePressEvent(self, event):
        print "QMainWindow mousePress"

    def mouseMoveEvent(self, event):
        print "QMainWindow mouseMove"

    def mouseReleaseEvent(self, event):
        print "QMainWindow mouseRelease"

    def Scene(self):
        self.s = QtGui.QGraphicsScene(self)

    def View(self):
        self.v = View(self.s)
        self.setCentralWidget(self.v)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(300, 200)
    window.show()
    sys.exit(app.exec_())

そして、次のような出力が表示されます。

QGraphicsView mousePress
QGraphicsView mouseMove
...
QGraphicsView mouseMove
QGraphicsView mouseRelease

ご覧のとおり、イベントを渡すことを選択しないviewため、イベントを「見る」ことができます。view

または、でこれらのイベントを無視することを選択できますQGraphicsView。これは、「これでは何もしません。他の人に任せてください」と言っているようなものです。そして、イベントは親に渡され、何をするかを選択します。

class View(QtGui.QGraphicsView):
    def mousePressEvent(self, event):
        print "QGraphicsView mousePress"
        # ignore the event to pass on the parent.
        event.ignore()

    def mouseMoveEvent(self, event):
        print "QGraphicsView mouseMove"
        event.ignore()

    def mouseReleaseEvent(self, event):
        print "QGraphicsView mouseRelease"
        event.ignore()

そして出力:

QGraphicsView mousePress
QMainWindow mousePress
QGraphicsView mouseMove
QMainWindow mouseMove
...
QGraphicsView mouseMove
QMainWindow mouseMove
QGraphicsView mouseRelease
QMainWindow mouseRelease

viewこれで、それが最初にイベントを取得することがわかります。ただし、これignoreはイベントであるため、メインウィンドウに渡され、その後でのみQMainWindowシグナルを受信します。

簡単に言えば、心配しないでください。あなたviewはイベントを受け取り、それらにうまく行動します。

于 2013-02-05T09:31:56.427 に答える