我在场景的不同部分分布了多个QGraphicsItem
个场景。在应用程序中,有一种模式的用户可以滚动场景(手掌拖动模式)。
要实现滚动场景,我将dragMode
的{{1}}设置为QGraphicsView
。
但问题是当用户尝试通过拖动(ScrollHandDrag
和MousePress
)在任何MouseMove
上滚动场景而不是滚动场景时它会移动QGraphicsItem
。< / p>
如何阻止QGraphicsItem
移动并滚动场景,但我仍想选择QGraphicsItem
s?
任何解决方案或任何指针都会有所帮助。
注意: QGraphicsItem
的数量非常多,且种类繁多。
因此无法在QGraphicsItem
上安装事件过滤器。
答案 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 );
}