2011-12-18 5 views
3

QGraphicsItemを実装するChartblockオブジェクトを作成しました。私の目標は、これらのオブジェクトのグリッドを作成し、マウスボタンが押され(そして保持され)、各ブロック上の薬物であるときに、カーソルがそのブロックに入るときに各ブロックで何かを実行することです。Qt C++複数のQGraphicsItemで1つのマウスイベントを処理させる

QGraphicsItemは、マウスイベントがクリックされたときにマウスイベントを取得するため、mouseMoveEventでは他のアイテムは起動しません。その後、すべてのマウスイベントを処理するためにQGraphicsItemGroupに基づくオブジェクトを作成しましたが、mousePressEvent/mouseReleaseEventだけでなく、mouseMoveEventをカーソルがある各子に渡す方法が必要でした。

私はこれをやりすぎると思いますか?このような簡単な操作は作成するのが難しいはずはないようですが、QGraphicsItems自体がマウスイベントを保持しているため、どうやって回避するかわかりません。私は似たような状況を読んだことがありますが、何も簡単な答えを出すことはできません。

編集:これを行う方法は、配列内に作成したすべてのQGraphicsItemの座標/サイズを追跡し、グループmouseMoveEventのカーソルの位置を取得し、ヒットしたかどうかを確認すると思います。

+0

それが表示され、[この古い質問](http://stackoverflow.com/questions/3845615/detect-when-mouse-enter-qgraphicsitem-with-button-down)で正確に私が何をしたいのか、実際の解決方法は言及されていません。 – giraffee

答えて

1

解決策を作成するためにいくつかの同様の回答をまとめることができました。私はすべてのQGraphicItemをグループに入れて、シーンに直接配置するという考えを落としました。シーンがすべてのマウスイベントを取得すると、現在の位置がQGraphicsItemの上にあるかどうかを確認するmouseMoveEventチェックがあります。もしそうなら、何かを実行します。

itemAt()はQGraphicsItemを返すので、QGraphicsItemを実装する自分のクラスで動作するようにitemAt()を取得する必要がありますが、いくつかキャストすると機能するはずです。

void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 
    QPointF mousePosition = event->scenePos(); 
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y()); 
} 
+0

答えの質問について: 'itemAt()'はQGraphicsItemを返します。このクラスでは、派生クラスでオーバーライドしてクラスの型を示すカスタム値を返すことができる仮想関数であるtype()を呼び出します。 –

関連する問題