QGraphicsWidget如何实现鼠标拖动?
我试过了
setFlag(QGraphicsItem::ItemIsMovable);
这有时会奏效(?)
例如,节点 6 我可以用鼠标移动,但其余节点不会移动。
另外,当我移动某个节点时,如何实现它,连接到该节点的边缘会随之移动。
真正的原因可能是您没有提供该shape()
函数的覆盖。此功能用于定义“碰撞”几何:您可以单击的对象部分。如果您QGraphicsItem
直接从继承,它似乎在不提供定义的情况下工作正常,但QGraphicsWidget
会覆盖shape()
函数本身并简单地返回QWidget::rect()
(也可能没有在您的类中定义),因此QGraphicsItem
当您不再使用默认实现时继承自QGraphicsWidget
!
如果您提供一个 shape 函数的定义,该函数返回一个围绕您为节点绘制的圆的椭圆,我敢打赌它可能会开始工作。例如:
QPainterPath MyGraphicsWidget::shape() const
{
QPainterPath path;
path.addEllipse(QPointF(0, 0), 25, 25);
return path;
}
这可能是一个老问题,但我自己花了 3 个小时试图解决这个问题。如果不是您,希望这个答案对那里的人有用;)
setFlag(QGraphicsItem::ItemIsMovable) 应该是使 QGraphicsItem 可以用鼠标拖动的全部;你可能想检查你的代码,看看你是否不小心在其他对象的某个地方取消了该标志,或者类似的东西。(此外,如果您是直接从 QGraphicsItem 子类化,而不是从提供的子类之一(如 QGraphicsEllipseItem),请确保您的 contains() 和 boundingRect() 方法返回正确的结果)
至于使附加边缘随节点移动,我认为您需要在自己的代码中执行此操作。特别是,调用 setFlag(QGraphicsItem::ItemSendsScenePositionChanges) 在任何具有一个或多个边缘对象关联的节点上。然后在实现节点的 QGraphicsItem 子类中,覆盖该QVariant itemChange(GraphicsItemChange, const QVariant &)
方法。在该方法的实现中,请注意第一个参数的值何时等于 QGraphicsItem::ItemScenePositionHasChanged,如果是,则更新任何关联的边缘对象,以便将适当的端点移动到节点的新位置。