Qt,QTransform旋转

3
我正在尝试在圆柱体上绘制文本。这意味着我有五行文本。顶部一行沿X轴旋转10度。第二行为5度。中间一行不旋转。第四行旋转-5度。第五行旋转-10度。 前三行的绘制正常,但第四、五行出现了问题。我做错了什么? 我提供了一张图片以便理解问题和代码片段:
for( int i = 0; i < iterationsCount; ++i )
{
    const QRect r( x2, y2, textWidth, itemHeight );

    const QString text = sections.at( section ).values.at( index );

    int rsc = 0;


    p->save();

    rsc = widgetHeight / 2 - y;

    p->setTransform(QTransform().rotate(rsc, Qt::XAxis));


    if( type == Section::DaySectionShort ||
        type == Section::DaySectionLong )
    {


        QStringList values = text.split( QLatin1Char( ' ' ) );

        p->setPen(
            lighterColor( opt.palette.color( QPalette::WindowText ), 75 ) );
        p->drawText( r, Qt::AlignLeft | Qt::TextSingleLine, values.at( 0 ) );

        p->setPen( opt.palette.color( QPalette::WindowText ) );
        p->drawText( r, Qt::AlignLeft | Qt::TextSingleLine, values.at( 1 ) );
    }
    else
    {
       p->drawText( r, Qt::AlignLeft | Qt::TextSingleLine, text );
    }

    p->setTransform(QTransform().rotate(-rsc, Qt::XAxis));

    index = nextIndex( index, sections.at( section ).values.size() );
    y += itemHeight + itemTopMargin;

    p->restore();
}

My problem


为什么您设置 QTransform().rotate(-rsc...) 而不使用 p?而且为什么 rsc 的计算如此奇怪? - ilotXXI
因为一开始我需要旋转,例如,旋转10度。之后我需要将另一个字符串旋转-10度,这就是我使用rsc和-rsc的原因。 - Дмитрий Дяков
但是在这个集合和下一个循环迭代之间,你没有绘制任何东西。你不是在 nextIndex 函数中完成的吗? - ilotXXI
查看我底部添加的代码片段中的p->drawText绘制文本的代码行。这是由此代码绘制的图像。请参考链接查看图片。 - Дмитрий Дяков
1个回答

1

由于您没有提供一个最小完整的代码来重现问题,我无法猜测出错的原因。但最有可能的原因是rsc计算不正确。至少下面的草稿可以工作:

#include <QtCore>
#include <QtGui>
#include <QtWidgets>

class MyWidget: public QWidget
{
public:
    MyWidget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        QFont f = font();
        f.setPointSize(15);
        setFont(f);
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        QWidget::paintEvent(event);
        QPainter p(this);

        const int itemHeight = fontMetrics().height();
        const int itemTopMargin = 15;
        const int xOffset = 15;
        int y = itemHeight;

        for (size_t i = 0; i < 5; ++i) {
            // The angle is in range [-40, 40]. Remove " * 4" for [-10, 10].
            const int rsc = (10 - 5 * i) * 4;
            qDebug() << i << ":\t" << rsc << "\t" << y;

            /*
                Rotation must be performed relative to central point of the
                drawn item. Transformations below are applied in reverse order.
                At first translate item to make it's center in (0, 0). At
                second rotate it relative to X axis. At third move the item to
                desired position.
            */
            QTransform transform;
            transform.translate(xOffset, y + itemHeight / 2);
            transform.rotate(rsc, Qt::XAxis);
            transform.translate(0, - itemHeight / 2);
            p.setTransform(transform);

            p.drawText(QPoint(), QString("(Item no. %1)").arg(i + 1));

            y += itemHeight + itemTopMargin;
        }
    }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.setMaximumSize(200, 250);
    widget.show();

    return app.exec();
}

这里使用的变换很复杂,因为需要相对于每个项目的中心 y 而不是 y = 0 进行旋转。这也可能是这种情况。

字体和角度增加以更好地观察考虑的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接