我的目标系统是:
/usr/lib/fonts
目录中),我的测试应用程序非常简单:只有一个对话框上有一些静态QLabel
(一个用于中文,一个用于阿拉伯语,一个用于西里尔语等)。
当我在我的Linux桌面上运行它时,所有标签都正确显示。但是当它在我的目标系统上运行时,一些文本就会消失。
经过一番研究,我发现Qt框架的行为存在差异:
QFontDatabase
类报告我的桌面系统上只有4个Droid字体系列:
Droid Sans [unknown]
Droid Sans [monotype]
Droid Sans Mono
Droid Serif
但是同一个QFontDatabase
类报告我的目标系统上有很多分隔的字体系列:
Droid Arabic Naskh
Droid Sans
Droid Sans Armenian
Droid Sans Ethiopic
Droid Sans Fallback
Droid Sans Georgian
Droid Sans Hebrew
Droid Sans Japanese
Droid Sans Mono
Droid Sans Thai
Droid Serif
结果,如果我为我的应用程序更改“default”字体系列(通过-fn
命令行选项或通过在我的应用程序中调用setFont()
手动),会显示一些文本标签,但其他不是(例如,当我使用“Droid Sans Hebrew”字体系列时,韩语文本丢失,但希伯来语/阿拉伯语也没问题。)
所以,我的问题是:在Qt Embedded应用程序中输出多语言文本的正确方法是什么?为什么“Droid Sans”家族会分开?有没有办法将它们组合在一起?
感谢。
答案 0 :(得分:4)
我创建了一个小型测试应用程序,它从文件加载字体然后在GUI中使用它。
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
/* Load font data from file in the same directory as executable */
QFile fontFile("BaroqueScript.ttf");
if (!fontFile.open(QIODevice::ReadOnly)) {
qCritical() << "failed to open font file";
}
QByteArray fontData = fontFile.readAll();
/* Register font to the QFontDatabase */
if (QFontDatabase::addApplicationFontFromData(fontData) == -1) {
qCritical() << "failed to add a font";
}
/* Create font object and verify font family */
QFont font("Baroque Script", 10, QFont::Bold);
QFontInfo fontInfo(font);
qDebug() << "Expected:" << font.family() << "Real:" << fontInfo.family();
/* Produce GUI which uses loaded font */
QLabel label("Hello, world");
label.setFont(font);
label.show();
return app.exec();
}
答案 1 :(得分:1)
@qehgt你能提供你的CJK和阿拉伯语字体文件大小吗?我遇到过类似的问题......问题是由于字体缓存大小的限制。我认为它大约3MB。因此,增加字体缓存大小是一种可能性,或者您必须根据所选语言动态加载字体文件。 希望这有助于.. :))
答案 2 :(得分:1)
好吧,看起来终于找到了解决方案。
Qt嵌入式渲染引擎中存在一个错误:由于某些原因,它使用“QPF2”字体引擎(QFontEngineQPF
)来渲染“破损”脚本中的文本(在我的情况下为希伯来语/阿拉伯语/泰语/韩语)
要避免/解决此问题,只需运行带有QWS_NO_SHARE_FONTS=1
环境变量的应用程序(以及-fn "Droid Sans"
命令行参数)。
之后显示所有语言的所有文本都没有任何问题。