3

我的目标系统是:

  • linux 3.3.7,
  • Qt Embedded(开源版)4.8,
  • Droid 字体(取自 fonts-droid_20111207+git-1_all.deb Debian 包并复制到/usr/lib/fonts目录中),
  • 用于主要 Qt GUI 应用程序的 Linux 帧缓冲区,
  • 一切都是由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 希伯来语”字体时)家庭,缺少韩文文本,但希伯来文/阿拉伯文都可以)。

所以,我的问题是:在 Qt Embedded 应用程序中输出多语言文本的正确方法是什么?为什么“Droid Sans”一家会分开?有没有办法将它们结合在一起?

谢谢。

4

3 回答 3

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();
}
于 2013-01-10T13:57:48.907 回答
2

好吧,看起来解决方案终于找到了。

Qt Embedded Rendering Engine 中有一个错误:由于某些原因,它使用“QPF2”字体引擎QFontEngineQPF

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

之后,所有语言的所有文本都会显示,没有任何问题。

于 2013-07-26T21:05:43.063 回答
1

@qehgt 你能提供你的 CJK 和阿拉伯字体文件大小吗?我遇到了类似的问题......问题是由于字体缓存大小的限制。我认为它大约 3MB。因此,增加字体缓存大小是一种可能性,或者您必须根据所选语言动态加载字体文件。希望这可以帮助.. :)

于 2013-07-22T13:44:08.717 回答