问题很简单!我想要使用
QPainter
类来实现以下内容。不希望旋转数值,但是使用QPainter::rotate
方法得到的数值如下(旋转格式): 请问有人能通过使用QPainter
帮助我画出像第一张图片那样的带数值的圆形吗?以下是我处理它的最简代码,假设我在小部件的绘制事件中进行绘画:
#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));
}
}
沿任意路径绘制无公式文本
创建路径
有一个名为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));
}