为qgraphicsObject实现mouseMoveEvent以跟随游标

时间:2018-03-02 08:07:05

标签: qt qgraphicsscene qgraphicsitem qmouseevent

我有一个Qt应用程序,其中包含从QGraphicsObjcet派生的对象,这些对象需要在场景中移动。我知道我可以使用标志来实现这一点。

myObject->setFlag(QGraphicsItem::ItemIsMovable); myObject->setFlag(QGraphicsItem::ItemIsSelectable); myObject->setFlag(QGraphicsItem::ItemSendsGeometryChanges);

但是当我使用它时,我遇到了弹出位置的对象的问题。对象移动到不正确位置的唯一时间是当我移动的对象被删除并从场景中移除时,下次当我尝试移动场景中的另一个对象时,它相对于鼠标Cursor的位置会被扭曲,直到我释放它并再次按下它。我意识到我的问题可能在我的代码中的某个地方完全发生,但是从我自己的调试中我至少想尝试自己实现移动功能来解决这个问题。

所以我的问题是:如何实现可移动对象(源自QGraphicsObject),就好像上面的标志是活动的一样?

我一直在尝试使用mouseMoveEvent,但无法弄清楚如何使用光标移动对象。也许我应该调查DragMoveEvent呢?如果可能的话,我会非常感谢看下面的mouseMoveEvent代码:

void myObject::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
// How do I get myObject to follow 
// the event pos in the scene from here?

QGraphicsObject::mouseMoveEvent(event);

update();

}

1 个答案:

答案 0 :(得分:0)

我认为这样的事情应该可以解决问题(未经测试):

void myObject::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{

// Set the item position as the mouse position.
this->setPos(event->scenePos());
// If your object (this) has no parent, then setPos() place it using scene coordinates, which is what you need here.

QGraphicsObject::mouseMoveEvent(event);
update();
}

使用上面的代码,您的对象将跟随鼠标直到世界末日,因此您可能希望将其与开始/停止标志组合。 如果您的项目有父项,则可能需要翻译坐标。