您好,感谢您的阅读。在QGraphicsView中拖动鼠标时,我无法正确量化多个QGraphicsItems的位置。如果一次只拖动一个,我设置的系统可以正确量化QGraphicsItem,但是,如果我选择了多个并拖动它们,则只量化主要项(鼠标正下方的项),其余项的位置将连续设置。我非常感谢任何人对此的帮助。相关代码如下:
它位于从QGraphicsRectItem继承而来的名为MutaEvent的类中。我重新定义了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;
}任何帮助都将不胜感激!
发布于 2011-08-11 20:43:33
看看如何覆盖QGraphicsItem::itemChange protected函数。在那里,您可以在项目位置即将更改(QGraphicsItem::ItemPositionChange)时收到通知,并有机会修改该值。无论更改是如何启动的(鼠标移动、组的一部分、在代码中设置等),都会调用此方法。
我怀疑您的部分问题是QGraphicsItem::setPos()不是虚拟的,这意味着如果调用者将您的MutaEvent*的实例视为QGraphicsItem*,则不会调用您的setPos()函数。这在Qt框架中的任何地方都是如此,因为,当然,他们并不了解您的MutaEvent类。这就是他们提供虚拟itemChange方法的原因。
发布于 2011-08-11 05:16:56
所有选定的项都是您的MutaEvent类吗?在每个选定的项上都会调用setPos(),因此如果没有调用,它将只使用默认实现。
如果你想让它正常工作,你可能需要实现你自己的鼠标事件处理(顺便说一句,在MutaEvent::mouseMoveEvent中调用setPos(pos())不会有任何效果)。
https://stackoverflow.com/questions/7014679
复制相似问题