7

シーン内に複数QGraphicsItemの があり、シーンのさまざまな部分に広がっています。アプリケーションには、ユーザーがシーンをスクロールできるモード (手のひらドラッグ モード) の 1 つにさまざまなモードがあります。シーンのスクロールを実現するために、 を に設定dragModeQGraphicsViewましたScrollHandDrag

しかし、問題は、ユーザーが移動するシーンをスクロールするのではなく、ドラッグ (MousePressおよびMouseMove) してシーンをスクロールしようとした場合です。QGraphicsItemQGraphicsItem

シーンの移動を停止QGraphicsItemしてスクロールするにはどうすればよいですか?それでも を選択したいQGraphicsItemのですが?

任意のソリューションまたはポインタが役立ちます。

注 :非常に多数のQGraphicsItemがあり、さまざまなタイプがあります。そのため、sにイベント フィルターをインストールすることはできませんQGraphicsItem

4

2 に答える 2

7

ScrollHandDrag モードでは、アイテム フラグを変更する代わりに、ビュー全体を非インタラクティブに設定しました。問題は、それを有効にするには、追加のインタラクション タイプ (つまり、コントロール キー、その他のマウス ボタンなど) が必要なことです。

setDragMode(ScrollHandDrag);
setInteractive(false);
于 2013-04-22T15:07:38.643 に答える
0

解決しました!!

Qtフォーラムで私が尋ねた質問を参照してください:ここをクリック

解決策/例:

void YourQGraphicsView::mousePressEvent( QMouseEvent* aEvent )
{
    if ( aEvent->modifiers() == Qt::CTRL ) // or scroll hand drag mode has been set - whatever condition you like :)
    {
        QGraphicsItem* pItemUnderMouse = itemAt( aEvent->pos() );
        if ( pItemUnderMouse )
        {
            // Track which of these two flags where enabled.
            bool bHadMovableFlagSet = false;
            bool bHadSelectableFlagSet = false;
            if ( pItemUnderMouse->flags() & QGraphicsItem::ItemIsMovable )
            {
                bHadMovableFlagSet = true;
                pItemUnderMouse->setFlag( QGraphicsItem::ItemIsMovable, false );
            }
            if ( pItemUnderMouse->flags() & QGraphicsItem::ItemIsSelectable )
            {
                bHadSelectableFlagSet = true;
                pItemUnderMouse->setFlag( QGraphicsItem::ItemIsSelectable, false );
            }

            // Call the base - the objects can't be selected or moved by this click because the flags have been un-set.
            QGraphicsView::mousePressEvent( aEvent );

            // Restore the flags.
            if ( bHadMovableFlagSet )
            {
                pItemUnderMouse->setFlag( QGraphicsItem::ItemIsMovable, true );
            }
            if ( bHadSelectableFlagSet )
            {
                pItemUnderMouse->setFlag( QGraphicsItem::ItemIsSelectable, true );
            }
            return;
        }
    }


    // --- I think This is not required here
    // --- as this will move and selects the item which we are trying to avoid.
    //QGraphicsView::mousePressEvent( aEvent );

}
于 2012-10-17T13:22:44.987 に答える