旋转后QGraphicsSvgItem定位

时间:2014-10-27 17:06:24

标签: qt svg rotation rotational-matrices qtsvg

当我尝试旋转QGraphicsSvgItem对象并设置位置时,我遇到了一个奇怪的问题/功能。

检查以下示例: 为了简单起见,我有一个.svg是一个蓝色矩形。我使用该文件创建了两个QGraphicsSvgItem,然后我以90度旋转它们。我将它们设置到相同的位置,但旋转的位置错误地定位(可能这是正确的行为)。看起来x,y坐标(左上角)现在是右上角,保持不旋转。从我的观点来看,这看起来很奇怪,我希望当我旋转并设置位置时,第一点就是#39;形状应该是形状开始的地方。

我希望上面写的源代码更容易理解:

    SVGDom *bubbleDom = shadowgram->bubble();
    _bubble = new DrawableSvgItem(sh->message(), bubbleDom->byteArray());
    this->addItem(_bubble);
    _bubble->setPos((this->width()-_bubble->sceneBoundingRect().width()) / 2, (this->height() - _bubble->sceneBoundingRect().height()) / 2);
    qDebug() <<"Bubble pos: " << _bubble->pos();
    qDebug() <<"Bubble boundindRect: " << _bubble->boundingRect();
    qDebug() << "Bubble rect: " <<_bubble->sceneBoundingRect();
    qDebug() << "Bubble topleft: " <<_bubble->sceneBoundingRect().topLeft();

    DrawableSvgItem *bubble2 = new DrawableSvgItem(sh->message(), bubbleDom->byteArray());
    this->addItem(bubble2);
    bubble2->setRotation(90);
    bubble2->setPos(_bubble->pos());
    qDebug() << "Bubble2 pos: " << bubble2->pos();
    qDebug() <<"Bubble2 boundindRect: " << bubble2->boundingRect();
    qDebug() << "Bubble2 rect: " <<bubble2->sceneBoundingRect();
    qDebug() <<"Bubble2 topleft: " << bubble2->sceneBoundingRect().topLeft();

DrawableSvgItem只是QGraphicsSvgItem的扩展,我创建用于将源路径绘制到项目中。目前我没有使用它。

输出:

Bubble pos:  QPointF(413.5, 297)
Bubble boundindRect:  QRectF(0,0 171x117)
Bubble rect:  QRectF(296.5,297 117x171)
Bubble topleft:  QPointF(296.5, 297)
Bubble2 pos:  QPointF(413.5, 297)
Bubble2 boundindRect:  QRectF(0,0 171x117)
Bubble2 rect:  QRectF(411.458,297 173.016x119.967)
Bubble2 topleft:  QPointF(411.458, 297)

在图片中,我期待以下内容:

enter image description here

但我得到了以下图片:

enter image description here

我发现了类似的问题here

1 个答案:

答案 0 :(得分:1)

bubble2围绕其变换原点旋转。默认情况下,它在bubble2的坐标中为0,0。此外,bubble2->setPos()将此点设置为_bubble的0,0,因此您只需将bubble2->setPos()调整为所需的pos。您可以按setTransformOriginPoint()更改变换原点。

编辑5.11.2014:

bubble2的左上角在bubble2坐标中定义。项目转换不会更改这些坐标,旋转后项目的左上角与之前的角落相同。这一点由setPos()放置。所以图2显示了正确的行为。你要放在气泡(x,y)上的角落是bubble2的左下角。要获得图片1,您只需要在代码中添加1行: 要么在最后一步中将bubble2移动到右边的高度

bubble2->setpos(413.5 + 117, 297)

或作为第一步设置bubble2到bottem左角的转换原点

bubble2->setTransformOriginPoint(0,117)