【问题标题】:QGraphicsSvgItem positioning after rotation旋转后的 QGraphicsSvgItem 定位
【发布时间】:2014-10-27 17:06:24
【问题描述】:

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

检查以下示例: 为了简单起见,我有一个.svg,它是一个蓝色矩形。我使用该文件创建了两个QGraphicsSvgItem,并将它们旋转了 90 度。我将它们都设置为相同的位置,但是旋转的位置“错误”(也许这是正确的行为)。看起来 x,y 坐标(左上角)现在是右上角,仍然没有旋转。从我的角度来看,这看起来很奇怪,我希望当我旋转并设置位置时,形状的“第一个点”应该是形状“开始”的位置。

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

    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)

在图片中,我期望如下:

但我得到了以下图像:

我发现了类似的问题here

【问题讨论】:

    标签: qt svg rotation rotational-matrices qtsvg


    【解决方案1】:

    bubble2 围绕其变换原点旋转。在气泡 2 的坐标中默认为 0,0。此外,bubble2-&gt;setPos() 将此点设置为 _bubble 的 0,0,因此您只需将bubble2-&gt;setPos() 调整为所需的位置。您可以通过setTransformOriginPoint()更改变换原点。

    编辑 5.11.2014:

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

    bubble2->setpos(413.5 + 117, 297)
    

    或者作为第一步将bubble2的变换原点设置为左下角

    bubble2->setTransformOriginPoint(0,117)
    

    【讨论】:

    • 感谢您的回答和您的时间。我会尝试玩这个。
    • 它并没有真正解决我的问题。我试过了,但几乎发生了同样的事情。
    猜你喜欢
    • 2020-12-26
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多