c++ - 使用 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 分成另外两个带有特殊字体的标签集。
解决方案
您的代码看起来不错,但是您在 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()};
推荐阅读
- excel - 以不同颜色突出显示副本(并连接整行)EXCEL
- remix - 将共享文件夹连接到 Remix 时出现 Remixd 错误
- python - 无法比较 none 类型和 int 类型
- vba - 如何覆盖 VBA 中的类方法?
- excel - 宏在我的 PC 上的运行与在另一台 PC 上的运行不同
- selenium - 无法使用 cypress 找到“iframe”
- netlogo - 什么代码可以使乌龟和补丁变量的下限保持在零以上?
- r - R CMD 检查注意:`No visible binding for global variable`,当在 S3 泛型中定义变量并在方法中使用它时
- javascript - 从模块导入异步函数
- r - R中的百分位数类别