2009-08-30 13 views
2

私は基本的に、それぞれが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" が印刷されています。 EditorSceneEditorViewは、さまざまなタイプのマウスイベントを受信するため、それらを渡すのは簡単ではありません。

EditorWindowでもマウス座標が必要です。現在、私は窓から捉えられた子どもからの信号を送信しています...しかし、そうするためには必ずしもそれを中継する必要はありませんか?


見つけたnice articleignore()を呼び出すと、別の受信機を見つけるようにQtに指示します。それはうまくいくはずですが、おそらくとは無関係の受信機を意味します。それを伝播する適切な方法はとても似BaseClass::Eventを呼び出すために実際にある:

void EditorView::mouseMoveEvent(QMouseEvent* event) { 
    QGraphicsView::mouseMoveEvent(event); // propogate to parent widget 
    printf("C\n"); 
} 

は、今では素晴らしいですBCBCBCを...印刷していますが、私は1つの以上のレベルをそれを微調整するように見えることはできません...


別の編集:が適切に伝播されていましたが、私はちょうどsetMouseTrackingを有効にしていませんでした。

答えて

3
QGraphicsView::mouseMoveEvent(event); 

親まで伝播しません。実際には、シーンに伝播します。

QGraphicsViewはQMouseEventを受け取り、それをQGraphicsSceneMouseEventに変換してシーンに渡します。シーンが適切なアイテムに渡されるか、場合によっては「B」が印刷されます。イベントハンドラはEditorViewに戻り、 "C"を出力します。

次に、イベントを明示的に無視すると(マウスの移動はデフォルトで受け入れられます)、QtイベントハンドラはそのイベントをEditorViewの親に渡します。だから、 "C"を印刷した後で無視してみてください。

マウスの移動についてのもう一つの事はこれです:マウストラッキングがオフになっている場合

マウスを移動させながら、マウスボタンが押された場合、マウス移動イベントにのみ発生します。マウストラッキングがオンになっていると、マウスボタンが押されなくてもマウス移動イベントが発生します。

したがって、EditorViewの親にトラッキングが有効になっていることを確認してください(またはボタンを押したときに:))。

EDIT: ところで、EditorSceneはEditorViewの親ではありません。まあ、それはあなたのコードにありますが、QObjectの意味では親権(メモリ管理のみ)の意味です。

QGraphicsSceneとViewには通常の家族関係はありません。シーンには複数のビューがあり、それらのビューは関係のない親の子です。

ウィンドウイベントの伝播では、QWidgetベースの親が必要です。実際、私はEditorWindow、またはその子の1つにエディタビューを返すことを確信しています(レイアウトに追加するとき)。

INSTAEDIT: 座標を表示するには、自分自身で信号を送信する必要があります。デカップリングの理由と、親ウィンドウではなく画面座標(右?)ではなく、ビューのローカル座標を表示する必要があるためです。実際にシーン座標が必要な場合は、変換行列が分かっているので、Viewも正しい選択です。

座標は次のようになります。 画面 - > EditorWindow local - > EditorView local - >シーンの変換 - >変換されたローカルな項目。

+0

QGraphicsSceneでは、マウストラッキングがデフォルトでオンになっていると思います。 EditorSceneはEditorViewの親です。エディタビューからEditorSceneにイベントの最後のビットを渡しても問題はありません。 EditorWindowのレベルが1つ上がっていますが、それは問題です...現時点では問題はありませんが。 – mpen

+0

正確です。 EditorWindowはマウストラッキングを有効にしていますか? – Eugene

+0

ああシュート...あなたは正しい。 QGraphicsViewはsetMouseTrackingを必要としませんが、メインウィンドウは行いません。しかし、他のウィジェットの上にカーソルを置いたときにmouseMovementを取り上げることはありません。 – mpen

2

私のmousePressEventのQGraphicsView :: mousePressEvent(e)がトリックでした!

関連する問題