QGraphicsWidget鼠标拖动。

时间:2013-05-04 19:01:57

标签: c++ qt

如何在QGraphicsWidget上实现鼠标拖动?

我试过

setFlag(QGraphicsItem::ItemIsMovable);

这有效(?)

enter image description here

例如,节点6我可以使用鼠标移动,但其余节点不会移动。

另外,当我移动某个节点时,如何实现它,附加到该节点的边缘随之移动。

2 个答案:

答案 0 :(得分:1)

真正的原因可能是您没有提供shape()功能的覆盖。此功能用于定义"碰撞" geometry:可以单击的对象部分。如果您直接从QGraphicsItem继承,那么在没有提供定义的情况下似乎一切正常,但QGraphicsWidget会覆盖shape()函数本身,只返回QWidget::rect()(也可能不会在您的类中定义),因此当您从QGraphicsItem继承时,QGraphicsWidget的默认实现不再被使用!

如果你提供了一个shape函数的定义,它返回一个椭圆,它围绕你为你的节点绘制的圆圈,我打赌它可能会开始工作。例如:

QPainterPath MyGraphicsWidget::shape() const
{
    QPainterPath path;
    path.addEllipse(QPointF(0, 0), 25, 25);
    return path;
}

这可能是一个老问题,但我花了3个小时试图解决这个问题,我自己。希望这个答案对那些人有用,如果不是你的话;)

答案 1 :(得分:0)

setFlag(QGraphicsItem :: ItemIsMovable)应该是使用鼠标拖动QGraphicsItem所需的全部内容;你可能想检查你的代码,看看你是不是意外地在其他对象的某个地方取消设置那个标志,或类似的东西。 (如果您直接从QGraphicsItem继承子类而不是像QGraphicsEllipseItem那样提供子类之一,请确保您的contains()和boundingRect()方法返回正确的结果)

至于使附加边缘与节点一起移动,我认为您需要在自己的代码中执行此操作。特别是,在具有与之关联的一个或多个边缘对象的任何节点上调用setFlag(QGraphicsItem :: ItemSendsScenePositionChanges)。然后在实现节点的QGraphicsItem子类中,覆盖QVariant itemChange(GraphicsItemChange, const QVariant &)方法。在您对该方法的实现中,请注意第一个参数的值何时等于QGraphicsItem :: ItemScenePositionHasChanged,如果是,则更新任何关联的边对象,以便将相应的端点移动到节点“s”。新职位。