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
はイベントを受け取り、それらにうまく行動します。