如何在QGraphicsWidget上实现鼠标拖动?
我试过
setFlag(QGraphicsItem::ItemIsMovable);
这有效(?)
例如,节点6我可以使用鼠标移动,但其余节点不会移动。
另外,当我移动某个节点时,如何实现它,附加到该节点的边缘随之移动。
答案 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”。新职位。