在的QGraphicsView的ScrollHandDrag模式,如何停止场景QGraphicsIt

2019-09-24 05:14发布

我有多个QGraphicsItem S IN的场景跨越场景的不同部位蔓延。 在应用中有模式用户可以滚动场景(棕榈拖动模式)中的一个不同的模式。 为了实现对现场滚动我设置dragModeQGraphicsViewScrollHandDrag

但问题是,当用户试图在现场通过拖动(滚动MousePressMouseMove上的任何的) QGraphicsItem而不是滚动场景它移动QGraphicsItem

如何停止的运动QGraphicsItem和滚动现场 ,但我还是想选择QGraphicsItem S'

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

注:有非常大量QGraphicsItem S和多种类型的。 所以这是不可能安装上事件过滤器QGraphicsItem秒。

Answer 1:

而不是修改该项目的标志我设置ScrollHandDrag状态的总体视图不是交互式的一段时间。 问题是,你需要有一个额外的互动类型(即控制键,其他的鼠标按钮等)来启用它。

setDragMode(ScrollHandDrag);
setInteractive(false);


Answer 2:

解决了 !!

请参阅问题我问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 );

}


文章来源: In ScrollHandDrag mode of QGraphicsView, How to stop movement of QGraphicsItems on scene?