嵌入式Qt方案中文顯示系列:應用程序本地中文顯示的實現

嵌入式Qt應用程序進行中文顯示有兩種解決方案,一種是直接在代碼中使用中文,利用QTextCodec類來實現,另外一種是使用qt平臺的國際化支持機制,經過語言翻譯來實現。第一種方案直接明瞭,相對來講也簡單方便一點,除了編碼時麻煩點(來回切換輸入法),而第二種方法的優勢是具備良好的擴展性,代碼中所有使用英文,而後使用中文翻譯文件來進行語言翻譯,當須要其它語言方案時,只須要添加翻譯文件就能夠。這裏先介紹第一種方案,以後再寫第二方案的文章。 app

方案實現

直接使用中文,利用QTextCodec類來實現中文的顯示方案實現經過下面的三個步驟: 函數

  1. 中文字體文件的存在:前文提到過字體文件的內容,文泉驛字體庫是支持中文的。
  2. 應用程序代碼中QTextCodec的設置和QFont字體的設置:對整個應用程序來講,通常是放在main函數中進行設置,大概的代碼以下:
  3. int main(int argc, char *argv[])
    {
        QApplication app(argc,argv);
        ...
        QTextCodec* codec = QTextCodec::codecForName("UTF-8");
        app.setFont(QFont("wenquanyi",16,75,FALSE,QFont::Unicode));
        app.setDefaultCodec(codec);
        ...
    
        return app.exec();
    }
    這裏須要說明一下TextCodec和Font的區別:
    • TextCodec:上面app.setDefaultCodec(codec)語句設置的TextCodec編碼格式是指代碼源文件的編碼格式,不一致則沒法會出現中文亂碼。
    • Font: 上面設置的字體是說明應用使用的字體格式,這個參考前文的內容很好理解,字體的參數內容若是和字體文件的不一致,也只會使用最接近的字體文件格式,指定的參數無效,即若是隻有wenquanyi_160_75.qpf字體文件,那麼設置下面的字體和上面的設置效果是同樣的。
    app.setFont(QFont("wenquanyi",22,87,FALSE,QFont::Unicode));
  4. 第三步就是在源代碼文件中直接編輯使用中文,而後確保該源文件的編碼格式和上面TextCodec中設置的格式是一致的。若是不一致,例如TextCodec設置的是「GBK",而源文件用的確是UTF-8格式,則中文顯示亂碼——我曾遇到的問題,改爲一致後就OK了。

只要確保上面三步都是正確的,就能夠實現qte應用程序中的中文顯示了。 字體

關於QObject::tr()函數與中文顯示的說明

上面的方案實現中文的顯示,是能夠不使用QObject::tr()函數的,由於該函數是針對第二種方案設計的。 編碼

看一下該函數的源代碼: 翻譯

QString QObject::tr( const char *text, const char * comment )
{
    if ( qApp )
    return qApp->translate( "QObject", text, comment );
    else
    return QString::fromLatin1(text);
}
它使用QApplication類的translate翻譯函數對輸入參數text進行翻譯,輸出翻譯的字符串。translate函數的原型:
QString QApplication::translate ( const char * scope, const char * key, 
       const char * comment ) const;
該函數查找已經安裝好的翻譯信息文件,對key參數進行查找翻譯,若是找到則返回翻譯後的文本字串,若是找不到或者不存在相應的信息文件,則直接返回key自己,即不進行翻譯。

所以能夠看出,在第一種方案中,咱們沒有安裝翻譯器和翻譯信息文件,也就沒有必要使用QObject::tr()函數。實際上在使用tr時,還支持專門爲tr翻譯的文本指定TextCodec編碼格式,以識別翻譯出的文本,指定的編碼格式應該和翻譯信息文件中的編碼格式一致。這些將在第二方案的文章中進行更多的說明。 設計

相關文章
相關標籤/搜索