qt

How to write a text around a circle using QPainter class?


The question is simple ! I want something like this. Either using QPainter class or using Qt Graphics Framework:

enter image description here


Solution

  • There are several ways to do this using a QPainterPath specified here.

    Here is the second example from that page:

    #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();
    }