【问题标题】:How to quantize the position of multiple QGraphicsItems while dragging the mouse in a QGraphicsView?如何在 QGraphicsView 中拖动鼠标时量化多个 QGraphicsItem 的位置?
【发布时间】:2011-08-11 20:43:33
【问题描述】:

您好,感谢您的阅读。在 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;
}

任何帮助将不胜感激!

【问题讨论】:

    标签: qt mouse mouseevent qgraphicsview qgraphicsitem


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-29
        • 1970-01-01
        • 2017-08-02
        • 2020-03-16
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        相关资源
        最近更新 更多