3

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

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

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

我正在使用 Qt 4.6

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

但是现在每次项目的坐标更改时都会触发该事件。我只想在用户完成更改时才进行活动。

4

2 回答 2

1

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

例如:

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

WasMoved() 是您知道项目是否被移动的方法

于 2010-01-05T14:46:15.443 回答
1

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

但是,正在拖动的代码是阻塞代码,所以你可以把它放在那里,因为代码只有在你释放鼠标按钮后才会继续,它总是有效的......(QT 4.7+)

于 2012-02-05T03:04:05.057 回答