3

QGraphicsWidget如何实现鼠标拖动?

我试过了

setFlag(QGraphicsItem::ItemIsMovable);

这有时会奏效(?)

在此处输入图像描述

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

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

4

2 回答 2

1

真正的原因可能是您没有提供该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 个小时试图解决这个问题。如果不是您,希望这个答案对那里的人有用;)

于 2016-12-29T06:26:15.667 回答
0

setFlag(QGraphicsItem::ItemIsMovable) 应该是使 QGraphicsItem 可以用鼠标拖动的全部;你可能想检查你的代码,看看你是否不小心在其他对象的某个地方取消了该标志,或者类似的东西。(此外,如果您是直接从 QGraphicsItem 子类化,而不是从提供的子类之一(如 QGraphicsEllipseItem),请确保您的 contains() 和 boundingRect() 方法返回正确的结果)

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

于 2013-05-05T01:58:26.707 回答