我们正在开发 Qt5 应用程序,并在 macOS 上使用 Qt 5.15.2 进行构建(在 Catalina 和 Big Sur 上)。
在
QFontDatabase
加载 QQmlApplicationEngine
文件之前,我们使用 main.qml
在 C++ 中加载 Open Sans 和 Ubuntu 字体。这些字体已直接从 Google 的字体网站下载:https://fonts.google.com/
// before QQmlApplicationEngine::load("qrc:/main.qml");
QList<int> fontIDs;
// OPEN SANS
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-Regular.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-Italic.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-Bold.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-BoldItalic.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-ExtraBold.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-ExtraBoldItalic.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-Light.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-LightItalic.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-SemiBold.ttf");
fontIDs << QFontDatabase::addApplicationFont(":/CoreUIFonts/fonts/opensans/OpenSans-SemiBoldItalic.ttf");
在极少数情况下,启动构建的应用程序时(在调试模式或发布模式下),使用加载的字体系列的 QML 中显示的文本会失真。
奇怪的是,扭曲的字体仅在新机器上启动应用程序的前几次出现。几次启动后,问题就消失了(至少,我们还没有找到合适的模式)。我们正在努力在我们的机器上可靠地重现此问题,因为它每隔几天构建/测试就会发生一次。这使得调试/查找问题的根本原因变得非常困难,因此很难修复。
我们认为部分问题可能与不存在 qmlcache 文件有关。因此我们尝试删除所有缓存文件,但这并没有使问题再次出现。在 macOS 上,我们知道的 qml 缓存文件存储在
~/Library/<ORGANISATIONNAME>/<APPNAME>/qmlcache
。删除这些并重新启动应用程序不会导致再次发生字体扭曲。
在实例化
main
和 QApplication
并加载 QML 之前,我们在 QQmlApplicationEngine
函数开始时应用了以下设置。它们似乎不会影响此问题的可重现性。
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering);
字体应用于
Text
组件,如下所示:
Text {
font.family: "Open Sans" // or "Ubuntu"
font.weight: Font.Normal // or Font.Bold or Font.DemiBold, etc...
}
我们的问题是:
刚刚遇到同样的问题,即使使用系统字体(使用 harfbuzz/fontconfig 和不使用它们),有什么发现或解决方案吗?如有任何想法,我将不胜感激。