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(中国語用、アラビア語用、キリル文字用など) が 1 つあるだけです。

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」フォントを使用する場合)。ファミリー、韓国語のテキストが欠落していますが、ヘブライ語/アラビア語は問題ありません)。

私の質問は、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 に答える