私は基本的に、それぞれがmouseMove
イベントを処理する必要がある3つのレイヤー(Window > Scene > View
)を、他のレイヤーをブロックせずに持っています。一番若い子供だけがイベントを取得しているようです。私はイベントを処理してからevent->ignore()
に電話してイベントをスタックに戻すことを望んでいましたが、動作していないようです。Qt - イベントを複数のオブジェクトに渡しますか?
あなたがそれを必要とする場合、一部の関連するコード:
void EditorWindow::createScene() {
m_scene = new EditorScene(this);
m_view = new EditorView(m_scene);
// ...
}
void EditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) {
printf("B\n");
// ...
}
void EditorView::mouseMoveEvent(QMouseEvent* event) {
printf("C\n");
event->ignore();
}
のみ "C" が印刷されています。
EditorScene
と
EditorView
は、さまざまなタイプのマウスイベントを受信するため、それらを渡すのは簡単ではありません。
EditorWindow
でもマウス座標が必要です。現在、私は窓から捉えられた子どもからの信号を送信しています...しかし、そうするためには必ずしもそれを中継する必要はありませんか?
見つけたnice article。 ignore()
を呼び出すと、別の受信機を見つけるようにQtに指示します。それはうまくいくはずですが、おそらくとは無関係の受信機を意味します。それを伝播する適切な方法はとても似BaseClass::Event
を呼び出すために実際にある:
void EditorView::mouseMoveEvent(QMouseEvent* event) {
QGraphicsView::mouseMoveEvent(event); // propogate to parent widget
printf("C\n");
}
は、今では素晴らしいですBCBCBCを...印刷していますが、私は1つの以上のレベルをそれを微調整するように見えることはできません...
別の編集:はが適切に伝播されていましたが、私はちょうどsetMouseTracking
を有効にしていませんでした。
QGraphicsSceneでは、マウストラッキングがデフォルトでオンになっていると思います。 EditorSceneはEditorViewの親です。エディタビューからEditorSceneにイベントの最後のビットを渡しても問題はありません。 EditorWindowのレベルが1つ上がっていますが、それは問題です...現時点では問題はありませんが。 – mpen
正確です。 EditorWindowはマウストラッキングを有効にしていますか? – Eugene
ああシュート...あなたは正しい。 QGraphicsViewはsetMouseTrackingを必要としませんが、メインウィンドウは行いません。しかし、他のウィジェットの上にカーソルを置いたときにmouseMovementを取り上げることはありません。 – mpen