我有多个QGraphicsItem
S IN的场景跨越场景的不同部位蔓延。 在应用中有模式用户可以滚动场景(棕榈拖动模式)中的一个不同的模式。 为了实现对现场滚动我设置dragMode
的QGraphicsView
到ScrollHandDrag
。
但问题是,当用户试图在现场通过拖动(滚动MousePress
和MouseMove
上的任何的) QGraphicsItem
而不是滚动场景它移动QGraphicsItem
。
如何停止的运动QGraphicsItem
和滚动现场 ,但我还是想选择QGraphicsItem
S'
任何解决方案或任何指针会有所帮助。
注:有非常大量QGraphicsItem
S和多种类型的。 所以这是不可能安装上事件过滤器QGraphicsItem
秒。
而不是修改该项目的标志我设置ScrollHandDrag状态的总体视图不是交互式的一段时间。 问题是,你需要有一个额外的互动类型(即控制键,其他的鼠标按钮等)来启用它。
setDragMode(ScrollHandDrag);
setInteractive(false);
解决了 !!
请参阅问题我问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?