您好,感谢您的阅读。在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;
}
非常感谢任何帮助!
答案 0 :(得分:0)
所有选定的项目都是您的MutaEvent课程吗?在每个选定的项目上调用setPos(),如果没有,则只使用默认实现。
如果您希望它正常工作,您可能需要实现自己的鼠标事件处理(顺便说一下,在MutaEvent :: mouseMoveEvent中调用setPos(pos())将没有任何效果。)
答案 1 :(得分:0)
请看一下覆盖QGraphicsItem::itemChange
受保护的功能。从那里,您可以在项目位置即将更改(QGraphicsItem::ItemPositionChange
)时收到通知,并有机会修改该值。无论如何启动更改(鼠标移动,组的一部分,代码设置等),都会调用此方法。
我怀疑你问题的一部分是QGraphicsItem::setPos()
不虚拟,这意味着如果调用者正在处理您的实例,则不会调用您的setPos()
函数MutaEvent*
为QGraphicsItem*
。 Qt框架中的每个地方都是如此,因为他们当然不了解你的MutaEvent
课程。这就是他们提供虚拟itemChange
方法的原因。