【问题标题】:Qt, QTransform rotationQt, QTransform 旋转
【发布时间】:2016-09-05 23:32:38
【问题描述】:

我正在尝试在“圆柱体”上绘制文字。这意味着,我有五行文本。顶行按 X 轴旋转 10 度。第二个为5度。中间根本没有旋转。四人行旋转 -5 度。五个旋转 -10 度。 第 1、2、3 行绘制正常,但 4,5 行出现问题。我究竟做错了什么 ? 我提供了一张用于理解问题和代码 sn-p 的图像:

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 计算得这么奇怪?
  • 因为一开始我需要旋转,例如旋转10度。之后我需要将另一个字符串旋转 -10 度,这就是我使用 rsc 和 -rsc 的原因。
  • 但是在这个集合和下一个循环迭代之间你什么也没画。你不是在nextIndex函数里做的吗?
  • 使用 p->drawText 绘制文本的代码行。查看我底部添加到代码片段的图像的链接。这是一张由这段代码绘制的图像。

标签: c++ qt rotation drawing qpainter


【解决方案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 旋转每个项目。也可能是这种情况。

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

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 2011-11-26
    • 2010-10-27
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多