首页 > 解决方案 > 使用 C++ 在 QT 5 中使用 QPainter 绘制文本可能做错了什么?

问题描述

在我正在编写的游戏的自定义小部件的 paintEvent 方法中,在调用各种模型对象的 render() 方法将它们渲染到小部件后,我试图渲染“高分”文本。这是文本绘制的一般代码:

painter.fillRect(event->rect(), QColor(0, 0, 0));
painter.drawImage(QRectF(event->rect().x(), event->rect().y() + 30, 512, 512), getGameBoardImage());

//...rendering other model components

painter.setBrush(QBrush(QColor(255, 255, 255)));
//painter.setFont(getGameFont());
painter.setFont(QFont("Times New Roman", 16, QFont::Bold));
painter.drawText(0, 0, "HI-SCORE");

我“正在”尝试以从资源加载的自定义字体绘制文本(我在此处找到了答案),但即使使用白色画笔,它也不会显示。我想可能是因为我没有“设置”字体,但将其设置为 Times New Roman 也不会显示任何内容。我可能做错了什么?如您所见,背景是黑色背景,游戏板画在顶部,但在顶部和底部留下了一个小缓冲区。我需要做一些特别的事情来显示文本吗?请不要建议使用 QLabel,因为如果可能,我会尝试将其全部保存在一个小部件中。如果必须,我会将 Hi-Score 和 1-Ups 分成另外两个带有特殊字体的标签集。

标签: c++qtqpainter

解决方案


您的代码看起来不错,但是您在 0,0 处绘制,这是小部件画布的左上角,并且文本实际上在那里但不可见...

改为绘制

painter.drawText(margin, y+margin, "HI-SCORE");

其中 y 是用于绘制文本的字体的高度,边距是您知道一点边距边框以使其看起来更好,例如 5 个单位

更新

你可以得到你正在画的文字的价值,比如

 QFont font("times", 25);
 QFontMetrics fm(font);
 int pixelsW{fm.width("HI-SCORE")};
 int pixelsH{fm.height()};

推荐阅读