Qt 实现多语言的简易天气预报器


[1] 简单地使用 QTextCodec tr 配合

在默认情况下,我们直接在源码中使用中文,比如 setWindowTitle(tr(" 中文化研习 ")); ,则会在运行界面发现中文乱码。遇到这种问题,如果无需考虑国际化,则可以直接使用 QTextCodec 设置编码方式:

  1. QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));  

该语句需要包含头文件 #include <QTextCodec>

选择 GB18030 而不是 GBK 或者 GB2312 是因为前者的汉字收录更丰富,并向下兼容了后两者。但是在嵌入式设备上,如手机或 MP3 ,并不一定支持 GB18030

而既然是 setCodecForTr ,那么就应该在第一次对 tr() 的调用之前设置编码方式,一般应该在 main() 函数中紧接 Qapplication 对象创建后设置。 tr() 用来返回一个翻译过的文本版本,在编写代码的过程中,对每一个用户可见的文本都应该加上该函数。

这样设置了以后,基本的中文显示,如按钮文本、窗口标题以及文本编辑区域,都可以得到良好的显示。

值得一提的是,如果出现的不是乱码,而是问号,则可能是字符编码内无该字的编码。另外一种问题是,如果出现的是方框(正方形),而不是乱码,则可能是无该指定字体,可以通过设置 QFont 尝试解决该问题。

 

[2] 关于使用 QString 来显示中文

一是使用 toLocal8Bit fromLocal8Bit 。比如下述代码就可以良好地显示中文:

  1. QString gbText;  
  2. gbText = gbText.fromLocal8Bit("汉化");  
  3. btn = new QPushButton(gbText);  

通过这种方式可以使用系统的本地 8 位编码格式。

二是通过 QString QTextCodec 结合,设置在 const char * Qstring 之间转换时使用的编码格式,比如下述代码也可以使得汉字良好显示:

 

  1. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030"));  
  2. QString str = "汉化";  
  3. textEdit->append(str);  

 

[3] 使用 Qt 翻译家

Qt 提供了外部的翻译文件,只要对需要进行翻译的文本使用 tr() 函数,然后在 .pro 工程文件中添加 TRANSLATIONS = localizer.ts ,这里的文件名自然要根据具体需要设置。之后使用 lupdate 命令,如 lupdate localizer.pro ,生成 localizer.ts 。接着用 linguist 打开 localizer.ts ,并在文件里面进行相应文本的翻译,保存后发布,生成 localizer.qm

至此,在包含了头文件 #include <QTranslator> 后,即可以安装翻译家,将相应的文本进行翻译:

 

  1. QTranslator translator;  
  2. translator.load(":/localizer");  
  3. app.installTranslator(&translator);  

此时再运行程序,则可以发现界面上的文本已经得到翻译了。

补充:在上述代码中, localizer.qm 是由 qrc 文件指定位置的,本例中 localizer.qm 相对于 qrc 文件的位置是“ /localizer.qm ”,所以添加的时候使用“ :/localizer ”。而如果 qm 文件相对于 qrc 文件的位置是“ /translator/localizer.qm ”,则需要指定为“ :/translator/localizer.qm ”。

 

[4] 文件读写中的中文

这里以读取 Google 的天气 API 为例。

Google 的中文天气 API http://www.google.com/ig/api?hl=zh_cn&weather= ,等号后面加城市名,比如“ beijing ”或者“ hongkong ”。

API 是以 XML 格式给出信息,而如果我们不加以修饰地直接读取该 XML 文件的话,则会出现如“ é£ Žå‘ï ¼š ä ¸œåŒ—、 风 é ”之类的乱码。

针对这种情况,可以先使用(不一定必须使用) QString 存放信息,因为可以用 QTextCodec QString 进行编码格式的设置:

      

  1. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));  

这样的话就可以以相应的编码格式进行文件读取。运行后,可以看到中文显示正常。

同样地,使用其它方式进行文件读取的话也可以使用类似设置编码格式的方法。比如,使用 QTextStream 时,如果希望使用特定的编码进行读写,则可以使用该类的成员函数 setCodec()

  • 1
  • 2
  • 下一页

相关内容