【问题标题】:QGraphicsItem setPos() not triggeredQGraphicsItem setPos() 未触发
【发布时间】:2014-10-09 21:42:39
【问题描述】:

再次尝试实现贝塞尔曲线编辑器。有

class BezierNode : public QGraphicsItem

BezierNode::BezierNode(QPointF point, Type type) : QGraphicsItem()
{
    setPos(point);
    setFlags(ItemIsMovable | ItemSendsScenePositionChanges | ItemSendsGeometryChanges);
}   

它在 mousePress + mouseMove 上正确地在场景中移动,我可以在itemChange() 中捕获事件,以使用控制点进行一些额外的操作。在QGraphicsItem::mouseMoveEvent()(根据gitorious 上的Qt 源代码)中有一个对item->setPos(...) 的调用。但是,如果我尝试重新实现BezierNode::setPos(..),它永远不会在移动对象上触发。

void BezierNode::setPos(const QPointF &pos) {
    qDebug() << "setPos " << pos;
    m_point = pos;
    QGraphicsItem::setPos(pos);
}

在我的情况下,setPos() 仅在构造函数中触发(我在那里手动调用它)。是的,它在场景中正确移动,我可以使用pos() 获取它的位置并在任何地方使用它而不是 m_point,但我想了解那里发生了什么。

提前致谢。

【问题讨论】:

    标签: c++ qt qgraphicsitem


    【解决方案1】:

    QGraphicsItem::setPos() 不是虚拟的,所以你不能覆盖它。这就是永远不会调用 BezierNode::setPos() 的原因。

    【讨论】:

    • 所以我应该把所有的钩子都放在itemChange()?
    • 我不确定您实际上要做什么 - 为什么您不能使用 pos() 函数的返回值而不是拥有自己的 m_point 成员?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多