2012-03-02 4 views
2

Qt Graphics Viewフレームワークを使用するプログラムを作成しています。私は他のQGraphicsItem(またはそれの他のサブクラス)を含むクラスにサブタイプQGraphicsItemを割り当てました。このクラスは、付属のQGraphicsItemの親です。コンポジットオブジェクトで作業することです。mousePressEvent()をQGraphicsItemsのグループに伝播するにはどうすればよいですか?

docsから、私が達成しようとするもので紛争のようだ:mousePressEventignore()を呼び出す

  • は私のオブジェクトが移動できないようになります。私はそれを動かしたい。
  • accept()mousePressEventにコールすると、イベントが子オブジェクトに伝播されなくなります。子オブジェクトの中には、マウスイベントに反応するものがあります。

どうすればこの作品を作成できますか?

+1

親ハンドラーにQApplication :: postEventを呼び出させることで、アイテムの子のそれぞれにイベントを送信することを検討しましたか? – kenrogers

+0

最後のコメントを無視してください。悪いアイデア。以下のStyneの答えを参照してください。 – kenrogers

+0

私はこれをしようとしています:左マウスのプレスは、移動アクションの開始点であるため、 'mousePressEvent()'で受け入れられ、オブジェクトによって処理されます。他のオブジェクトはイベントを取得しません。他の入力(右ボタン、修飾キー)の場合、イベントは無視され、次のオブジェクトに移動します。 Stynes666は、あまり意味がないことがあるということについては正しいです。 –

答えて

2

私はあなたのドキュメントの解釈が間違っていると思います。

ignore()mousePressEventにコールすると、私のオブジェクトは移動不能になります。

私はそれが本当であるとは思わない。私にはignore()という呼び物が、「私はこのイベントを評価しました。私はこのイベントに応じて私が欲しいすべての行動を取っています。私はそれが私のためではないと決めました。私の下にある次のオブジェクトに」。 ignoreイベントがQGraphicsItem::ItemIsMovableフラグ(QGraphicsItemが移動可能かどうかを決定するフラグ)を設定解除することを示唆するものは何も見つかりません。

あなたがオブジェクトの移動ignore()イベント作ることができなかった理由を私は見ませんが、私は、これは賢明なアプローチではないことを助言する(ほとんどの場合:明らかにあなたがそれの原因を有していてもよいです)。

accept()mousePressEventにコールすると、そのイベントが子オブジェクトに伝播されなくなります。

私はこれが本当であると信じていますが、親は依然として子供を修正することができます。私の理解では、accept()という呼び物は、「私はこのイベントを評価しました。私はこのイベント(私の子供の修正を含むかもしれません)に応じて私が欲しいすべての行動を取っています。だから私はイベントを通過させません "。あなたの親QGraphicsItemで

+0

移動に関する問題は、マウスの移動イベントがないために発生します。「イベントでQEvent :: ignore()を呼び出すと、このアイテムはマウス・グラブを失い、イベントはその最下部のアイテムに伝播します。新しいマウスプレスイベントが受信されない限り、このアイテムに配信されます。 –

+0

(イベントに応答する正当な理由があると仮定し、無視していると言って**)、ignoreを呼び出す前にレスポンスを実行してください。 –

+0

提案したように子供に通知した後、accept()(mouseMoveEventsを取得する)を呼び出す方が意味があります。私は実際にchildrens mousePressEvent()メソッドを呼び出すことによってそれを試みましたが、保護されたメンバーであるためです。私はこれのための回避策を見つけることができると確信していますが、それは醜いように見えます。私の質問の主な動機はより良い提案を得ることでした。 –

0

、あなたはこれが(つまり、あなたのオブジェクトが可動します)マウスイベントの通常の処理を許可しますが、それが伝播されるように、それを無視してしまう

MyObject::mousePressEvent (QGraphicsSceneMouseEvent * event) 
{ 
    QGraphicsItem::mousePressEvent(event); 
    event->ignore(); 
} 

に試してみてください。

ただし、親と子が同じマウスイベントに応答すると、副作用のリスクが高いため、ロジックはより堅牢にする必要があります。

+0

私はこれを試しましたが、 'ignore()'を呼び出した後、オブジェクトはそれ以上のマウスイベントを受け取らないという問題があります。これが動きのあるところです。 –

0

QCoreApplication::postEvent(child, mouseEvent)を子オブジェクトに送信します。