如何在QGraphicsView中拖动鼠标时量化多个QGraphicsItems的位置?

时间:2011-08-10 16:52:40

标签: qt mouse mouseevent qgraphicsview qgraphicsitem

您好,感谢您的阅读。在QGraphicsView中拖动鼠标时,我无法正确量化多个QGraphicsItem的位置。我设置的系统是正确量化QGraphicsItem,如果一次只拖一个,但是如果我有多个选中并拖动它们,只有主要项目(直接在鼠标下面的那个)被量化,其余的位置连续设置。我非常感谢任何帮助。相关代码如下:

这是一个名为MutaEvent的类,它继承自QGraphicsRectItem。我重新定义了mouseMoveEvent()和setPos()函数:

void MutaEvent::mouseMoveEvent( QGraphicsSceneMouseEvent * event )
{
    QGraphicsRectItem::mouseMoveEvent(event);
    setPos(pos());
}

void MutaEvent::setPos(const QPointF &pos)
{
    QGraphicsRectItem::setPos(Muta::quantizePointD(pos,30,15));
    emit posChanged(objectID,pos);
}

下一位是名为Muta的命名空间中的静态函数:

static QPointF quantizePoint(QPointF point,double xQuant, double yQuant)
{
    double x = quantize(point.x(),xQuant);
    double y = quantize(point.y(),yQuant);
    QPointF quantPoint(x,y);
    return quantPoint;
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

所有选定的项目都是您的MutaEvent课程吗?在每个选定的项目上调用setPos(),如果没有,则只使用默认实现。

如果您希望它正常工作,您可能需要实现自己的鼠标事件处理(顺便说一下,在MutaEvent :: mouseMoveEvent中调用setPos(pos())将没有任何效果。)

答案 1 :(得分:0)

请看一下覆盖QGraphicsItem::itemChange受保护的功能。从那里,您可以在项目位置即将更改(QGraphicsItem::ItemPositionChange)时收到通知,并有机会修改该值。无论如何启动更改(鼠标移动,组的一部分,代码设置等),都会调用此方法。

我怀疑你问题的一部分是QGraphicsItem::setPos() 虚拟,这意味着如果调用者正在处理您的实例,则不会调用您的setPos()函数MutaEvent*QGraphicsItem*。 Qt框架中的每个地方都是如此,因为他们当然不了解你的MutaEvent课程。这就是他们提供虚拟itemChange方法的原因。