如何使用QPainter类在不旋转的情况下围绕圆圈写入值?

时间:2014-08-28 13:29:43

标签: qt draw qpainter

问题很简单!我希望使用QPainter类这样的东西。 enter image description here

我不希望旋转值。但是使用QPainter::rotate方法我得到的值是这样的(旋转格式)。

enter image description here

有人可以帮助我使用QPainter

绘制带有第一张图像等值的圆圈

2 个答案:

答案 0 :(得分:2)

这是关于我将如何做的最简单的代码。假设我正在绘制一个小部件的paint事件:

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

答案 1 :(得分:2)

沿任何路径绘制没有公式的文字

Arc Cubic
创建路径
有一个类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));
    }