Qt中中文处理的简单方法

系统 1617 0

QT是一套很不错的界面开发库,而且考虑到了跨平台的要求,使用也相对比较容易上手。我也刚刚才学习用QT开发,发现它对中文的处理做的不是很好,或者更贴切的是做的不够智能吧,如果在字符串中输入中文,显示的就会是乱码。

下面就介绍一个简单的方法,让我们的中文正确显示出来,先看一段程序,该程序主要功能就是显示一个窗口,窗口上面的按钮显示中文。

1 #include < qapplication.h >
2 #include < qpushbutton.h >
3 #include < qfont.h >
4 #include < qvbox.h >
5 #include < qtextcodec.h >
6 #include < qstring.h >
7 #include < qobject.h >
8 int main( int argc, char ** argv)
9 {
10 QApplicationa(argc,argv);
11
12 QVBoxbox;
13 box.resize( 200 , 120 );
14 QPushButtonquit( " 退出 " , & box) ;
15 quit.setFont(QFont( " Times " , 18 ,QFont::Bold));
16 QObject::connect( & quit,SIGNAL(clicked()), & a,SLOT(quit()));
17 a.setMainWidget( & box);
18 box.show();
19 return a.exec();
10 }

在vc6.0下面编译运行程序之后我们会见到界面如下,但是上面的按钮却是乱码了。


那我们该怎么办呢?别着急,其实方法很简单,主要思路就是给应用设定一个字符集,并且把要显示的字符做适当的转化处理就可以了,说起来好像还有些复杂,但是看看代码你就很快明白了。


1 #include < qapplication.h >
2 #include < qpushbutton.h >
3 #include < qfont.h >
4 #include < qvbox.h >
5 #include < qtextcodec.h >
6 #include < qstring.h >
7 #include < qobject.h >
8 int main( int argc, char ** argv)
9 {
10 QApplicationa(argc,argv);
11 a.setDefaultCodec(QTextCodec::codecForName( " GBK " ));
12 QVBoxbox;
13 box.resize( 200 , 120 );
14 QPushButtonquit(QObject::tr( " 退出 " ), & box);
15 quit.setFont(QFont( " Times " , 18 ,QFont::Bold));
16 QObject::connect( & quit,SIGNAL(clicked()), & a,SLOT(quit()));
17 a.setMainWidget( & box);
18 box.show();
19 return a.exec();
20 }


在vc6.0下面编译运行程序之后我们会见到界面如下,这个时候就显示正常了。

Qt中中文处理的简单方法

代码分析:
上面的两段代码基本上是大同小异,没有多大的差别,程序的具体含义这里我不做介绍,只讲一下两段代码的区别,见上例中代码的黄色部分,该部分就是为中文显示所做出的改进。
setDefaultCodec(QTextCodec::codecForName("GBK"));
查阅了qt的函数帮助可知,
setDefaultCodec的作用如下:
void QApplication::setDefaultCodec ( QTextCodec * codec )
设置应用程序的默认编解码器为codec。
如果程序中的文字引用文本不是Latin1编码,这个函数可以用来设置合适的编码。例如,韩国程序员开发的软件在程序中对所有文本可以使用eucKR,这种情况下,main()函数可能看起来像这样:

int main(int argc, char** argv)
{
QApplication app(argc, argv);
... install any additional codecs ...
app.setDefaultCodec( QTextCodec::codecForName("eucKR") );
...
}

注意,这不是用户来选择编码的方式。例如,把一个包含英语字符串的应用程序转换为韩语,所需要做的一切就是对于所有的英语字符串通过tr()传递并且载入翻译文件。有关国际化的详细情况,请参考Qt国际化文档。
注意也有一些Qt内置类为不同的字符串调用tr()。这些字符串使用英语,所以对于完整的翻译,编解码器将被这些字符串需要。


QPushButtonquit(QObject::tr("退出"),&box);
tr()函数的说明如下:
QString QObject::tr ( const char * sourceText, const char * comment ) const
返回sourceText的翻译版本,或者如果没有合适的版本返回sourceText它自己。翻译上下文是comment的QObject(默认为空)。所有使用Q_OBJECT宏的QObject对象有这个函数的重新实现,把子类名作为上下文。
也可以参考trUtf8()、QApplication::translate()和Qt中的国际化。
实例:network/networkprotocol/view.cpp。
QString QObject::trUtf8 ( const char * sourceText, const char * comment ) const
返回sourceText的翻译版本,或者如果没有合适的版本返回QString::fromUtf8(sourceText)。它是另一种tr(sourceText, comment)。
也可以参考tr()和QApplication::translate()。
两个函数的作用一个用来设定字符集一个是用来进行字符串转化,刚好满足了前面提到的思路,事情就是这样的,呵呵,就写到这里,希望对你有用。

Qt中中文处理的简单方法


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论