You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QGraphicsScene首次重绘后为何恢复为系统字体?

Qt5树莓派环境下QGraphicsScene重绘后字体重置问题的解决方案

问题分析

这个问题的核心是Qt5与Qt6在QGraphicsScene继承全局应用字体的行为上存在差异,同时树莓派Debian 11环境下的字体探测机制或系统默认字体优先级加剧了问题:

  • Qt6中QGraphicsScene会持续继承QApplication的全局字体设置,重绘也不会丢失;
  • 但Qt5中,QGraphicsScene的字体可能仅在初始化时同步全局字体,后续重绘时若没有显式绑定,会被系统默认字体或父控件字体覆盖;
  • 另外需确认树莓派上是否正确安装了"Spectral"字体,Qt5的字体匹配逻辑如果找不到指定字体,会自动 fallback 到系统默认字体(日志中的PibotoLt)。

解决方案

1. 显式绑定QGraphicsScene的字体

不要依赖全局字体的自动继承,在创建QGraphicsScene后直接设置其字体:

// 绑定到全局应用字体
this->scene->setFont(QApplication::instance()->font());

// 或者直接指定自定义字体
this->scene->setFont(QFont("Spectral", 12));

这样即使重绘,scene的字体也会保持设置的值,不会被重置。

2. 给文本项单独设置字体

绕过scene的字体继承,直接给添加的文本项显式设置字体,确保文本自身持有字体配置:

auto t0 = this->scene->addText("Hello, World!");
t0->setPos(10, 10);
t0->setDefaultTextColor(textColor);
// 显式设置字体
t0->setFont(QFont("Spectral", 12));

这种方式最可靠,文本项的字体不会受scene或全局字体变化的影响。

3. 验证字体是否正确加载

在树莓派环境下,先确认"Spectral"字体是否安装且能被Qt识别:

QFont testFont("Spectral", 12);
QFontInfo fontInfo(testFont);
qDebug() << "Actual font used:" << fontInfo.family();

如果输出不是"Spectral",说明Qt找不到该字体,需要重新安装字体,或者使用字体的正确家族名称(部分字体的内部家族名和显示名不同)。

4. 排查是否有其他代码修改场景字体

检查重绘相关的代码中,是否有其他逻辑(比如样式表设置、父控件字体变更)修改了QGraphicsScene的字体,确保没有意外的字体重置操作。

内容的提问来源于stack exchange,提问作者Arseni Mourzenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:07:47