QPainter 在时钟上绘制数字

Posted

技术标签:

【中文标题】QPainter 在时钟上绘制数字【英文标题】:QPainter draw numbers on clock 【发布时间】:2016-01-08 09:15:41 【问题描述】:
QPainter graduation(this);
pen.setWidth(2);
pen.setColor(Qt::white);
graduation.setPen(pen);
graduation.setRenderHint(QPainter::HighQualityAntialiasing);
graduation.translate(center.x(), center.y());
double newRadius = (width() - 50) / 2;
//qreal angleStep = 270 / m_stepsize;
for (int i = 0; i <= m_stepsize; i++)

    graduation.save();
    graduation.rotate(i * angleStep + 135);
    graduation.drawLine(newRadius - 8, 0, newRadius, 0);
    graduation.drawText(newRadius - 30, 0, "100");
    graduation.restore();

我使用上面的代码在时钟上绘制数字。这是我得到的

但我想绘制如下图所示的数字。不能倒置。

谁能帮帮我。我了解旋转功能,这就是它发生在数字上的原因,但我不知道如何解决它。

【问题讨论】:

不要在graduation.rotate()上下文中使用drawText,而是手动计算位置并在那里绘制文本。 手动计算位置要困难得多,而且时间太长。 如果您发布您的解决方案会很有趣(可以回答您自己的问题)。 我的解决方案可以解决“颠倒”的问题,但它不能像我展示的时钟一样绘制。它看起来像这样:aeternusconsulting.com/wordpress/wp-content/uploads/2013/06/… 【参考方案1】:

您可以手动计算位置并绘制未旋转的文本:

for (int i = 0; i <= m_stepsize; i++)

    graduation.save();
    graduation.rotate(i * angleStep + 135);
    graduation.drawLine(newRadius - 8, 0, newRadius, 0);
    graduation.restore();
    double xpos=(newRadius - 30)*cos((i * angleStep + 135.)/360.*2.*3.14159);
    double ypos=(newRadius - 30)*sin((i * angleStep + 135.)/360.*2.*3.14159);
    graduation.drawText(xpos, ypos, "100");

【讨论】:

@user2652023 你能再试一次吗?缺少因子 2。 太好了。这是工作。非常感谢你。即使它仍然需要进行一些配置才能更准确地绘制。但是没有你的想法我做不到。再一次,我可能需要问你一些事情。我理解计算“(newRadius - 30)*cos((i * angleStep + 135.)/360.*2.*3.14159)”但为什么我们必须除以360 * 2 * 3.14159 @user2652023 内置的 cossin 使用弧度 (0..2*pi) 而不是度 (0..360) 的角度,这就是角度需要的原因被转换。 PS:如果我的回答有效,其他用户可以看到您的问题已解决,请接受我的回答。 我现在明白了,非常感谢。我是***的新手。所以我只知道“接受”按钮,我已经做到了。很抱歉错过了这个。

以上是关于QPainter 在时钟上绘制数字的主要内容,如果未能解决你的问题,请参考以下文章

使用 QPainter 在 QWidget 上绘制 QPixmap Rects

QPainter 仅在 QImage 上绘制矩形的一部分

如何在Qgraphicsview上使用QPainter绘图

使用 QPainter 和 paintEvent 在 PYQT5 中的 QLabel 中包含的 Pixmap 上绘制圆圈

如何使用 QPropertyAnimation 和 QPainter 绘制弧线

Qt开发技术:Qt绘图系统QPainter详解