Qt方案中文显示:直接在代码中使用中文

2013年12月22日 由 Creater 留言 »

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

广告位

发表评论

你必须 登陆 方可发表评论.