2010-01-05 27 views
2

Qt的QGraphicsScene提供了一些不错的功能:用户可以选择对象并移动它们。如何获得QGraphicsScene报告项目移动事件

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

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

我使用Qt 4.6

事实证明,你必须设置一个标志,启用此事件: 用品 - > setFlag(::的QGraphicsItem ItemSendsGeometryChanges,真正的);

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

回答

1

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

例如:

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

WasMoved()是你的方法要知道,如果该项目被移动

+0

这就是我现在正在做的,它有点作品,但我更新程序的对象和结果它在每个鼠标释放所有对象被认为是移动,即使根本没有实际的运动。 – Viesturs 2010-01-05 14:51:00

+0

你在哪里在你的视图/场景类或你的项目类中写这个函数? – Drewen 2010-01-05 14:54:54

+0

这个函数在我的项目类中。 非平凡的情况是,可能有多个选定的对象被移动,所以我测试所有的项目被移动。 我想用QGraphicsScene :: selectedItems()会给出正确的结果。 – Viesturs 2010-01-07 08:51:49

1

除了因为你并不总是得到一个mouseReleaseEvent不能总是工作.. 。

在执行该拖动但是阻塞的代码,所以你可以把它在那里,因为你释放鼠标键后,代码只会继续和它始终工作......(QT 4.7+)

代码