7

我在场景中有多个QGraphicsItems 分布在场景的不同部分。在应用程序中有不同的模式,其中一种模式用户可以滚动场景(手掌拖动模式)。为了实现滚动场景,设置dragModeQGraphicsViewScrollHandDrag.

但问题是当用户尝试通过拖动 (MousePressMouseMove)QGraphicsItem来滚动场景时,它会移动而不是滚动场景QGraphicsItem

如何停止移动QGraphicsItem并滚动场景,但我仍想选择QGraphicsItems?

任何解决方案或任何指针都会有所帮助。

注意:有非常多的QGraphicsItems 并且是各种类型的。所以无法在QGraphicsItems 上安装事件过滤器。

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 回答