• 8010阅读
  • 0回复

[提问][Qt Topic] – 中文化研习,做一个多语言的简易天气预报器 [复制链接]

上一主题 下一主题
离线casual0402
 

只看楼主 倒序阅读 楼主  发表于: 2010-04-02
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
[Qt Topic] – 中文化研习,做一个多语言的简易天气预报器

作者:Jason Lee @ http://blog.csdn.net/jasonblog

日期:2010-04-01 -- 2010-04-02

平台:Qt SDK v2010.02.1 + Windows Xp

 

[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()。

 

[5]可动态切换语言的天气预报器

       关于这个话题可以精炼成以下几点(具体的完整代码将会在后面给出):

1、动态的语言切换的实现是通过在运行时,用户进行语言选择时触发的信号引起相应槽的运作。比如可以设置一个语言菜单供用户选择语言,我在这里只设置了英语和中文。当用户点击菜单选项的时候,利用QTranslator进行不同qm文件的重新载入,然后再重绘可见文本。所以这就要求:一是用户可见的文本应该用tr()函数处理,毕竟这不是一样很大的负担,最好将其养成习惯;二是生成用户可见文本的代码最好放在一个函数里,为了取名有意义可以取做retranslateUi()。

  1. void QWR::retranslateUi(){
  2.     enAct->setText(tr("&English"));
  3.     cnAct->setText(tr("&Chinese"));
  4.     languageMenu->setTitle(tr("&Language"));
  5.     cityLabel->setText(tr("City"));
  6.     runBtn->setText(tr("&Run"));
  7.     setWindowTitle(tr("QWeatherReporter"));
  8. }


2、天气预报的功能是通过调用Google API实现的,需要注意的是温度单位在国内外的不同。如果当前用户选择英文,就选择英文API,同样的,如果用户选择中文,就设置URL为中文API地址。这就需要在编码的时候进行判断,判断的方式有多种。

  1.     QString url;
  2.     if(cnAct->isChecked()){
  3.         url = "http://www.google.com/ig/api?hl=zh_cn&weather=";
  4.         url.append(cityBox->text());
  5.     }else{
  6.         url = "http://www.google.com/ig/api?hl=en&weather=";
  7.         url.append(cityBox->text());
  8.     }
  9.     request.setUrl(QUrl(url));


3、Google天气API给的结果是XML格式的,所以参考[4]中提到的,要设置编码格式。正确读取XML数据后,再根据结点名称获取具体的天气数据,如最高温、最低温以及日期等。

  1.     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
  2.     QString xmlFile = reply->readAll();
  3.     if(xmlFile.size() < 1000){  //Error city information
  4.         resultBox->setText("No Such City!");
  5.         return ;
  6.     }


4、最后就是将天气预报的结果呈现出来。



 

[结语]这个小程序我给放到了http://qwr.sf.net,各位如果有兴趣去可以下载完整源码。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jasonblog/archive/2010/04/02/5445191.aspx 
快速回复
限100 字节
 
上一个 下一个