3

QGraphicsItemを実装するオブジェクトChartblockを作成しました。私の目標は、これらのオブジェクトのグリッドを作成することです。マウスボタンを押して(押したままにして)各ブロックをドラッグしたら、カーソルがブロックに入るときに各ブロックで何かを実行します。

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

私はこれを行う方法を考えすぎていますか?このような単純なアクションを作成するのはそれほど難しいことではないようですが、QGraphicsItemsがそれ自体でマウスイベントを保持しているため、それを回避する方法がわかりません。私は同様の状況を読みましたが、簡単な答えを与えるものは何もないようです。

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

4

1 に答える 1

1

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

itemAtはQGraphicsItemのみを返すため、QGraphicsItemを実装する独自のクラスでitemAt()を機能させる必要がありますが、キャストによっては機能するはずです。

void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF mousePosition = event->scenePos();
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y());
}
于 2011-12-18T23:58:00.723 に答える