2013-05-04 102 views
3

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

我试着用

setFlag(QGraphicsItem::ItemIsMovable); 

这一段时间的工作(?)

enter image description here

例如,节点6我可以用鼠标移动,但其余节点惯于举动。

另外,我怎样才能实现当我移动某个节点时,连接到该节点的边缘随之移动。

回答

0

setFlag(QGraphicsItem :: ItemIsMovable)应该是您用鼠标拖动QGraphicsItem所需的所有东西;你可能想检查你的代码,看看你是否意外地在其他对象的某处设置了该标志,或者类似的东西。 (另外如果你直接从QGraphicsItem中继承而不是从QGraphicsEllipseItem提供的子类中提取子类,请确保你的contains()和boundingRect()方法返回正确的结果)

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

+0

但它不是QGraphicsItem,它的QGraphicsWidget。当我将子类QGraphicsItem,所有的作品,但问题是,我需要动画我的场景,并需要该QGraphicsWidgets,因为他们的属性,我可以动画与QPropertyAnimation – Steva 2013-05-05 08:35:10

+0

嗯。你的QGraphicsWidget子类是否覆盖mousePressEvent()或mouseMoveEvent()或类似的东西?如果是这样,你可能会检查那些重新实现,并看看它们对鼠标事件处理有什么影响(例如,它们只在某些情况下调用超类吗?它们调用e-> accept()或e-> ignore() )只有在某些情况下?)如果是这样,这可能解释为什么拖动只在某些情况下起作用。 – 2013-05-05 14:52:34

+0

它的确如此。我重新实现mousePressEvent弹出右键单击菜单。但是我尝试不用重新实现,仍然存在问题。但是,当我有节点没有边缘它工作正常,但与边缘它不会工作。边是继承QGraphicsWIdget的另一个对象,它绘制节点的独立(首先绘制边,然后绘制节点)。 – Steva 2013-05-05 16:27:31

1

真正的原因可能是您没有提供覆盖shape()函数。该功能用于定义“碰撞”几何体:您可以点击的对象部分。如果你直接从QGraphicsItem继承,似乎没有提供定义就可以正常工作,但QGraphicsWidget覆盖了shape()函数本身,并简单地返回QWidget::rect()(它也可能不在你的类中定义),因此QGraphicsItem的默认实现不是当您从QGraphicsWidget继承时,您将继续使用!

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

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

这可能是一个老问题,但我只花了3个小时试图弄清楚,我自己。希望这个答案对于那些不在你身边的人有用;)