• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-12-22)  QT |   抢沙发  20 
    文章评分 0 次,平均分 0.0

    Qt应用程序进行中文显示有两种解决方案,一种是直接在代码中使用中文,利用QTextCodec类来实现,另一种是使用qt平台的国际化支持机制,通过语言翻译来实现。第一种方案直接明了,相对来说也简单方便一点,除了编码时麻烦点(来回切换输入法),而第二种方法的优点是具有良好的扩展性,代码中全部使用英文,然后使用中文翻译文件来进行语言翻译,当需要其它语言方案时,只需要添加翻译文件就可以。这里先介绍第一种方案。

    方案实现

    直接使用中文,利用QTextCodec类来实现中文的显示方案实现通过下面的三个步骤:
    1.中文字体文件的存在:前文提到过字体文件的内容,文泉驿字体库是支持中文的。
    2.应用程序代码中QTextCodec的设置和QFont字体的设置:对整个应用程序来说,一般是放在main函数中进行设置,大概的代码如下:

    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));

    3.第三步就是在源代码文件中直接编辑使用中文,然后确保该源文件的编码格式和上面TextCodec中设置的格式是一致的。如果不一致,例如TextCodec设置的是“GBK",而源文件用的确是UTF-8格式,则中文显示乱码——我曾遇到的问题,改成一致后就OK了。
    只要确保上面三步都是正确的,就可以实现qt应用程序中的中文显示了。

    关于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编码格式,以识别翻译出的文本,指定的编码格式应该和翻译信息文件中的编码格式一致。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/2849.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享