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
相关产品推荐
相关产品推荐

