如何获取QGraphicsScene报表项移动事件

时间:2010-01-05 13:59:33

标签: qt qgraphicsview

Qt的QGraphicsScene提供了一些不错的功能:用户可以选择对象并移动它们。

我还想要一件事 - 当用户完成移动对象时收到通知。 有较低级别的事件,如鼠标移动,按下,释放,但我不想重新实现已经存在的功能(移动对象)。

http://doc.trolltech.com/4.2/qgraphicsitem.html#itemChange方法看起来像它,但在用户移动对象时不会调用它。

我正在使用Qt 4.6

事实证明你必须设置一个标志来启用此事件:   item-> setFlag(QGraphicsItem :: ItemSendsGeometryChanges,true);

但是现在每次项目的变化都会触发事件。我希望只有在用户完成更改时才会有事件。

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是为你的物品实施mouseRelease事件,当它被触发时你将能够知道物品是否被移动。如果项目已移动,则接受该事件,否则将事件发送到基类。

例如:

 void YourItem::mouseReleaseEvent(QMouseEvent *event)
 {
     if (wasMoved()) {
         //do something and accept the event
     } else {
         // to the base class
         QGraphicsItem::mouseReleaseEvent(event);
     }
 }

WasMoved()是您了解项目是否已移动的方法

答案 1 :(得分:1)

除非它总是不能正常工作,因为你并不总是得到一个mouseReleaseEvent ......

正在执行拖动的代码是阻塞代码,所以你可以把它放在那里,因为代码只会在你发布鼠标按钮后继续运行...(QT 4.7 +)