如何使用 QPainter 类在圆圈周围书写文字?

问题描述 投票:0回答:1

问题很简单!我想要这样的东西。使用

QPainter
类或使用 Qt Graphics Framework:

enter image description here

qt
1个回答
8
投票

有多种方法可以使用指定的

QPainterPath
来执行此操作这里

这是该页面的第二个示例:

#include <QtWidgets>
#include <cmath>
 
class Widget : public QWidget
{
public:
    Widget ()
        : QWidget() { }
private:
    void paintEvent ( QPaintEvent *)
    {
        QString hw("hello world");
        int drawWidth = width() / 100;
        QPainter painter(this);
        QPen pen = painter.pen();
        pen.setWidth(drawWidth);
        pen.setColor(Qt::darkGreen);
        painter.setPen(pen);
 
        QPainterPath path(QPointF(0.0, 0.0));
 
        QPointF c1(width()*0.2,height()*0.8);
        QPointF c2(width()*0.8,height()*0.2);
 
        path.cubicTo(c1,c2,QPointF(width(),height()));
 
        //draw the bezier curve
        painter.drawPath(path);
 
        //Make the painter ready to draw chars
        QFont font = painter.font();
        font.setPixelSize(drawWidth*2);
        painter.setFont(font);
        pen.setColor(Qt::red);
        painter.setPen(pen);
 
        qreal percentIncrease = (qreal) 1/(hw.size()+1);
        qreal percent = 0;
 
        for ( int i = 0; i < hw.size(); i++ ) {
            percent += percentIncrease;
 
            QPointF point = path.pointAtPercent(percent);
            qreal angle = path.angleAtPercent(percent);   // Clockwise is negative
 
            painter.save();
            // Move the virtual origin to the point on the curve
            painter.translate(point);
            // Rotate to match the angle of the curve
            // Clockwise is positive so we negate the angle from above
            painter.rotate(-angle);
            // Draw a line width above the origin to move the text above the line
            // and let Qt do the transformations
            painter.drawText(QPoint(0, -pen.width()),QString(hw[i]));
            painter.restore();
        }
    }
 
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    Widget widget;
    widget.show();
    return app.exec();
}
© www.soinside.com 2019 - 2024. All rights reserved.