在QGraphicsView的ScrollHandDrag模式中,如何停止QGraphicsItems在场景中的移动?

时间:2012-10-17 06:12:10

标签: qt qt4 qgraphicsview qgraphicsitem qgraphicsscene

我在场景的不同部分分布了多个QGraphicsItem个场景。在应用程序中,有一种模式的用户可以滚动场景(手掌拖动模式)。 要实现滚动场景,我dragMode的{​​{1}}设置为QGraphicsView

但问题是当用户尝试通过拖动(ScrollHandDragMousePress)在任何MouseMove上滚动场景而不是滚动场景时它会移动QGraphicsItem。< / p>

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

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

注意: QGraphicsItem的数量非常多,且种类繁多。 因此无法在QGraphicsItem上安装事件过滤器。

2 个答案:

答案 0 :(得分:7)

在ScrollHandDrag模式下,我设置整个视图不是交互式的,而不是修改项目标志。问题是,你需要有一个额外的交互类型(即控制键,其他鼠标按钮等)才能启用它。

setDragMode(ScrollHandDrag);
setInteractive(false);

答案 1 :(得分:0)

解决了!!

请参阅我在Qt论坛上提出的问题:Click Here

解决方案/实施例:

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 );

}