我只想将可移动标签添加到场景中:
QGraphicsWidget* w = scene->addWidget( new QLabel( "Test Label" ) );
w->setFlag( QGraphicsItem::ItemIsMovable, true );
但标签仍然无法移动。
答案 0 :(得分:2)
如果该项目未设置为可选项,则也无法移动该项目。
w->setFlag(QGraphicsItem::ItemIsSelectable, true);
此外,当您向场景添加小部件时,小部件嵌入在QGraphicsProxyWidget中。正如documentation所述: -
它在两个对象之间转发事件,并在QWidget的基于整数的几何和QGraphicsWidget的基于qreal的几何体之间进行转换。
因此,通常由QGraphicsItem处理的鼠标事件将传播到窗口小部件,而这并不知道它在代理窗口小部件中。为了在场景中拖动窗口小部件,您需要更改它,以便QGraphicsProxyWidget处理事件。
一种方法是从QGraphicsProxyWidget派生并覆盖mouseMoveEvent,mousePressEvent和mouseReleaseEvent。然后检测是否单击并释放鼠标而不拖动,在这种情况下将事件传播到窗口小部件,否则如果检测到鼠标已在移动事件中移动,而不调用mouseReleaseEvent,则相应地移动代理窗口小部件,使用QEvent::accept()
将事件设置为已接受