如何使用QPainter类在不旋转的情况下绘制围绕圆形的值?

4
问题很简单!我想要使用QPainter类来实现以下内容。不希望旋转数值,但是使用QPainter::rotate方法得到的数值如下(旋转格式):enter image description here 请问有人能通过使用QPainter帮助我画出像第一张图片那样的带数值的圆形吗?

它是一个圆形还是椭圆形? - vahancho
2个回答

4

以下是我处理它的最简代码,假设我在小部件的绘制事件中进行绘画:

#define PI 3.14159265

[..]

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QPoint center = rect().center();
    painter.drawEllipse(center, 2, 2);
    const int radius = 100;
    // Draw semicircle with texts on every 30".
    for (double i = .0; i <= 180.0; i += 30.0) {
        QPoint p(center.x() + radius * cos(i * PI / 180.0),
                 center.y() - radius * sin(i * PI / 180.0));
        painter.drawText(p, QString::number(i));
    }
}

3

沿任意路径绘制无公式文本

弧形 三次贝塞尔曲线
创建路径
有一个名为QPainterPath的类,您可以使用其中的一些方法绘制任何路径。
在您的情况下,可以使用arcTo方法。

QPainterPath path;
path.arcTo(rect, 210, -240.0);

计算起点
这里有一点困难:路径有一个起点。如果您调用 arcTo,它将创建一条线到弧的开始,然后绘制弧形。因此,您需要调用 moveTo 并将弧的起点作为参数传递进去。但是您从哪里可以获得它呢?使用弧的公式进行计算吗?不。当然可以尝试设置近似点或查找任何曲线的公式,但知道起点有一个简单的方法:绘制大小为零的曲线并获取其最后一个点:

QPainterPath initialPath; 
initialPath.arcTo(rect, 210, 0);
path.moveTo(initialPath.currentPosition());

绘制文本
当您拥有此路径时,可以使用pointAtPercent获取该路径的任何点,并使用drawText在那里绘制文本。
以下是绘制弧和数字的代码:

    QPainter p(this);

    p.drawArc(rect(), 210 * 16, -240 * 16);

    QRectF rect(20, 20, width() - 40, height() - 40);

    QPainterPath initialPath;
    initialPath.arcTo(rect, 210, 0);

    QPainterPath path;
    path.moveTo(initialPath.currentPosition());
    path.arcTo(rect, 210, -240.0);

    for (int i = 0; i <= 10; i += 1)
    {
        p.drawText(path.pointAtPercent((qreal)i / 10), QString::number(i));
    }

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