如何(正确地)输出多语言文本在qt嵌入


我的目标系统是:
    linux 3.3.7
  • ,
  • Qt嵌入式(开源版)4.8,
  • Droid字体(取自fonts-droid_20111207+git-1_all.deb Debian包并复制到/usr/lib/fonts目录),
  • Linux Framebuffer的主要Qt GUI应用程序,
  • 所有东西都是由Buildroot包构建的。

我的测试应用程序非常简单:只有一个带有几个静态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

因此,如果我为我的应用程序更改"默认"字体系列(通过-fn命令行选项或手动通过在我的应用程序中调用setFont())显示一些文本标签,但其他不显示(例如,当我使用"Droid Sans Hebrew"字体系列时,韩语文本丢失,但希伯来语/阿拉伯语是ok的)。

所以,我的问题是:在Qt嵌入式应用程序中输出多语言文本的正确方法是什么?为什么"Droid Sans"家族会分离?有什么办法把它们结合起来吗?

谢谢。

我已经创建了一个小的测试应用程序,它从文件中加载字体,然后在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();
}

看来解决办法终于找到了。

Qt嵌入式渲染引擎有一个bug:由于某些原因,它使用"QPF2"字体引擎(QFontEngineQPF)在"破碎"脚本(希伯来语/阿拉伯语/泰语/韩语在我的情况下)中渲染文本。

为了避免/解决这个问题,只需要运行一个带有QWS_NO_SHARE_FONTS=1环境变量(以及-fn "Droid Sans"命令行参数)的应用程序。

然后显示所有语言的所有文本,没有任何问题

@qehgt你能给你的CJK和阿拉伯字体文件大小吗?我也遇到过类似的问题……这个问题是由于字体缓存大小的限制。我想大概是3MB。增加字体缓存大小是一种可能或者你需要根据所选语言动态加载字体文件。希望这能帮到你…:)

最新更新