0

您好,感谢您的阅读。在 QGraphicsView 中拖动鼠标时,我无法正确量化多个 QGraphicsItems 的位置。如果一次只拖动一个,我设置的系统会正确量化 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;
}

任何帮助将非常感激!

4

2 回答 2

0

所有选定的项目都是你的 MutaEvent 类吗?setPos() 在每个选定的项目上调用,所以如果不是,它只会使用默认实现。

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

于 2011-08-10T21:16:55.923 回答
0

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

我怀疑您的部分问题是QGraphicsItem::setPos()不是虚拟的,这意味着setPos()如果调用者将您的实例MutaEvent*视为QGraphicsItem*. 在 Qt 框架中到处都是这种情况,因为当然,他们不知道你的MutaEvent类。这就是他们提供虚拟itemChange方法的原因。

于 2011-08-11T12:43:33.283 回答