通过父QGraphicsItem相关的QGraphicsItems在旋转之后会有错误的变换

时间:2014-02-05 16:32:20

标签: c++ qt qgraphicsitem qt4.8

我有不同形状的QGraphicsItems,用户可以创建。 每一个都由:

组成
  • 父母QGraphicsItem把所有东西放在一起
  • 用于用户互动的翻译句柄(QGraphicsItem本身):翻译
  • 用于用户交互的rotationhandle(QGraphicsItem本身):rotations
  • 表示形状的一个或多个点句柄(QGraphicsItem本身)
  • 1 QPainterPath,始终在点句柄之间绘制。

移动“点手柄”会导致仅更改形状的一部分,移动旋转或平移手柄,从而导致旋转和平移整个项目。

一切都很好,除了一种情况:在整个设置旋转时移动点控制柄。然后其他点手柄也被移动,并且翻译不适合鼠标移动。如果整个设置未旋转(旋转= 0.0),一切都运行良好。同时将设置旋转回0.0。

我尝试使用setTransformOriginPoint进行几乎所有更改。过去有人有过这种行为吗?

非常感谢 斯特凡

请求的代码示例:

创建“母亲”项目:

    BaseItem::BaseItem() : 
    QAbstractGraphicsShapeItem(),
    ...
{
    setFlags( ItemIsSelectable );

    m_rotateHandle = new RotationHandle(this);
    m_translateHandle = new TranslationHandle(this);

    ...
}

创建翻译句柄:(父母是上面的项目)

BaseItem::TranslationHandle::TranslationHandle( BaseItem* parent ) : 
    QGraphicsRectItem(-6, -6, 12, 12, parent), 
    m_parent(parent)
{
    setFlag( ItemIsMovable);
    setFlag( ItemIgnoresTransformations);
    setPos(100, 100);
}

创建旋转手柄:(父级是上面的项目)

    BaseItem::RotationHandle::RotationHandle( BaseItem* parent) : 
    QGraphicsEllipseItem(-6, -6, 12, 12, parent), 
    m_parent(parent),
    m_angle(0.0f)
{
    setFlag( ItemIsMovable );
    setFlag( ItemIgnoresTransformations);
    setPos(150, 150);
}

轮换事件处理程序:

void BaseItem::RotationHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ 
    m_angle += (event->scenePos() - event->lastScenePos()).x();
    QList<QGraphicsItem*> items = m_parent->scene()->selectedItems();
    foreach(QGraphicsItem* item, items) {
        BaseItem* bs_item = dynamic_cast<BaseShapeItem*>(item);
        if(bs_item) {
            bs_item->setRotation(m_angle);
        }
    }
}

点句柄构造函数:

    BaseItem::PointHandle::PointHandle( QPointF position, BaseItem* parent, QColor penColor) : 
    QGraphicsRectItem(-4, -4, 8, 8, parent), 
    m_parent(parent)
{
    setPos(position);
    setFlag( ItemIsMovable );
    setFlag( ItemIgnoresTransformations);
}

点句柄的移动事件:

void BaseItem::PointHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ 
    this->setPos( mapToParent(event->pos()) );
    m_parent->updateShape();
}

更新形状方法:

void BaseItem::updateShape()
{
    QPointF center = m_shape.boundingRect().center();
    setTransformOriginPoint( center );
    m_rotateHandle->setPos( center );
    m_translateHandle->setPos(center.x(), center.y()-20);
}

0 个答案:

没有答案