2

複数の QGraphicsItem を (Ctrl キーを使用して) 選択すると、それらを一緒に移動できますが、実際にイベントを受け取るアイテムに対してのみ mouseMoveEvent がトリガーされます。選択したすべてのアイテムがイベントを受け取れるようにする方法はありますか? Qtのドキュメントでは見つかりません。

選択した項目をグループ化し、QGraphicsView の mouseMoveEvent 内で処理できますか?

助けてくれてありがとう:)

4

2 に答える 2

3

いいえ、私が知る限り、あなたが望むことを行うデフォルトの方法はありません。あなたができることは次のとおりです。

  • サブクラスQGraphicsScene化して実装するmouseMoveEvent
  • itemAtマウス移動イベントで、関数を使用してイベント位置にアイテムがあるかどうかを確認します
  • アイテムがあり、それが選択されている場合 ( isSelected)、シーンの選択されているすべてのアイテムを取得します。
  • 選択したすべてのアイテムに対して、呼び出すのと同じ関数を呼び出します。

サンプルコードは次のとおりです。

void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent) 
{
    QPointF mousePosition = mouseEvent->scenePos();
    QGraphicsItem* pItem = itemAt(mousePosition.x(), mousePosition.y());
    if (pItem == NULL)
    {
        QGraphicsScene::mouseMoveEvent(mouseEvent);
        return;
    }

    if (pItem->isSelected() == false)  
    {
        QGraphicsScene::mouseMoveEvent(mouseEvent);
        return;
    }

    // Get all selected items
    QList<QGraphicsItem *> items = selectedItems();

    for (unsinged i=0; i<items.count(); i++)
        // Do what you want to do when a mouse move over a selected item.
        items[i]->doSomething(); 

    QGraphicsScene::mouseMoveEvent(mouseEvent);  
}
于 2011-11-17T16:55:00.093 に答える
1

私はあなたの質問の行間を少し読んでいますが、クラスに実装することでより良いサービスを提供できるように思えQGraphicsItem::itemChangeますQGraphicsItem。これは、マウス、キーボード、プログラムなどによって位置が変更されるたびに呼び出されます。必要に応じて、変更をキャンセルすることもできます。

于 2011-11-17T16:15:36.097 に答える