做一个多语言的简易天气预报器_第1页
做一个多语言的简易天气预报器_第2页
做一个多语言的简易天气预报器_第3页
做一个多语言的简易天气预报器_第4页
做一个多语言的简易天气预报器_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

[QtTopic]-中文化研习,做一个多语言的间易天气预报器作者:JasonLee@/jasonblog日期:2010-04-01--2010-04-02平台:QtSDKv2010.02.1+WindowsXp[1]简单地使用QTextCodec和tr配合在默认情况下,我们直接在源码中使用中文,比如setWindowTitle(tr(”中文化研习"));,则会在运行界面发现中文乱码。遇到这种问题,如果无需考虑国际化,则可以直接使用QTextCodec设置编码方式:viewplaincopytoclipboardprint?QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));该语句需要包含头文件#include<QTextCodec>。选择GB18030而不是GBK或者GB2312是因为前者的汉字收录更丰富,并向下兼容了后两者。但是在嵌入式设备上,如手机或MP3,并不一定支持GB18030。而既然是setCodecForTr,那么就应该在第一次对tr()的调用之前设置编码方式,一般应该在main()函数中紧接Qapplication对象创建后设置。tr()用来返回一个翻译过的文本版本,在编写代码的过程中,对每一个用户可见的文本都应该加上该函数。这样设置了以后,基本的中文显示,如按钮文本、窗口标题以及文本编辑区域,都可以得到良好的显示。值得一提的是,如果出现的不是乱码,而是问号,则可能是字符编码内无该字的编码。另外一种问题是,如果出现的是方框(正方形),而不是乱码,则可能是无该指定字体,可以通过设置QFont尝试解决该问题。

⑵关于使用QString来显示中文一是使用toLocal8Bit和fromLocal8Bit。比如下述代码就可以良好地显示中文:viewplaincopytoclipboardprint?QStringgbText;gbText=gbText.fromLocal8Bit("汉化");btn=newQPushButton(gbText);QStringgbText;gbText=gbText.fromLocal8Bit("汉化”)btn=newQPushButton(gbText);通过这种方式可以使用系统的本地8位编码格式。二是通过QString和QTextCodec结合,设置在constchar*和Qstring之间转换时使用的编码格式,比如下述代码也可以使得汉字良好显示:viewplaincopytoclipboardprint?QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030"));QStringstr="汉化";textEdit->append(str);

[3]使用Qt翻译家Qt提供了外部的翻译文件,只要对需要进行翻译的文本使用tr()函数,然后在.pro工程文件中添加TRANSLATIONS=localizer.ts,这里的文件名自然要根据具体需要设置。之后使用lupdate命令,如lupdate,生成localizer.ts。接着用linguist打开localizer.ts,并在文件里面进行相应文本的翻译,保存后发布,生成localizer.qm。至此,在包含了头文件#include<QTranslator>后,即可以安装翻译家,将相应的文本进行翻译:viewplaincopytoclipboardprint?QTranslatortranslator;translator.load(":/localizer");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为/ig/api?hl=zh_cn&weather=,等号后面加城市名,比如“beijing”或者“hongkong”。该API是以XML格式给出信息,而如果我们不加以修饰地直接读取该XML文件的话,则会出现如“e£?!??!%?a3?a?—a??e£?e”之类的乱码。针对这种情况,可以先使用(不一定必须使用)QString存放信息,因为可以用QTextCodec对QString进行编码格式的设置:viewplaincopytoclipboardprint?QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));这样的话就可以以相应的编码格式进行文件读取。运行后,可以看到中文显示正常。同样地,使用其它方式进行文件读取的话也可以使用类似设置编码格式的方法。比如,使用QTextStream时,如果希望使用特定的编码进行读写,则可以使用该类的成员函数setCodec()。[5]可动态切换语言的天气预报器关于这个话题可以精炼成以下几点(具体的完整代码将会在后面给出):1、动态的语言切换的实现是通过在运行时,用户进行语言选择时触发的信号引起相应槽的运作。比如可以设置一个语言菜单供用户选择语言,我在这里只设置了英语和中文。当用户点击菜单选项的时候,利用QTranslator进行不同qm文件的重新载入,然后再重绘可见文本。所以这就要求:一是用户可见的文本应该用tr()函数处理,毕竟这不是一样很大的负担,最好将其养成习惯;二是生成用户可见文本的代码最好放在一个函数里,为了取名有意义可以取做retranslateUi()。viewplaincopytoclipboardprint?voidQWR::retranslateUi(){enAct->setText(tr("&English"));

cnAct->setText(tr("&Chinese"));languageMenu->setTitle(tr("&Language"));cityLabel->setText(tr("City"));runBtn->setText(tr("&Run"));setWindowTitle(tr("QWeatherReporter"));}voidQWR::retranslateUi()(enAct->setText(tr("&English"));cnAct->setText(tr("&Chinese"));languageMenu->setTitle(tr("&LancityLabel->setText(tr("City"));runBtn->setText(tr("&Run"));setWindowTitle(tr("QWeatherReporter"));2、天气预报的功能是通过调用GoogleAPI实现的,需要注意的是温度单位在国内外的不同。如果当前用户选择英文,就选择英文API,同样的,如果用户选择中文,就设置URL为中文API地址。这就需要在编码的时候进行判断,判断的方式有多种。viewplaincopytoclipboardprint?QStringurl;i(cnAct->isChecked()){url="/ig/api?hl=zh_cn&weather=";url.append(cityBox->text());}else(url="/ig/api?hl=en&weather=”;url.append(cityBox->text());}request.setUrl(QUrl(url));

nceaxseaxst.l(url));www.nd(cityBo:/ig/api?hl->text());setUrl(QUrrequeif(<urlurl.}el;urlurl.nceaxseaxst.l(url));www.nd(cityBo:/ig/api?hl->text());setUrl(QUrrequeif(<urlurl.}el;urlurl.Act->isCheck("http://www.ppend(cityBo:{"http://pped())(/ig/api?hl=zh->text());3、Google天气API给的结果是XML格式的,所以参考[4]中提到的,要设置编码格式。正确读取XML数据后,再根据结点名称获取具体的天气数据,如最高温、最低温以及日期等。d())(/ig/api?hl=zh->text());QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));QStringxmlFile=reply->readAll();i(xmlFile.size()<1000){//ErrorcityinformationresultBox->setText("NoSuchCity!");return;}rxuuQStif(resret}rn;QTextCodec::setCodecForCStrings(QTextCodecingxmlFile=reply->readAll();rxuuQStif(resret}rn;mlFile.size()<1000){//ErrorcityinfltBox->setText("NoSuchCity!");4、最后就是将天气预报的结果呈现出来。*陶易多语天气鞭描器语言段,如雨23°小雨周一,21g24,多云周二,*陶易多语天气鞭描器语言段,如雨23°小雨周一,21g24,多云周二,22'F,晴间多云城市香邃查询6冈[结语]这个小程序我给放到了,各位如果有兴趣去可以下载完整源码。由于陆续有朋友邮件我说需要源码(其实上有),所以我给放到了CSDN资源上,地址为:/source/2231965[补充]后来,我在写一个程序的时候发现使用GB18030(或者GBK、GB2312也一样)在我的机子上运行是OK的,但是拿到其他机子(同样的系统)却出现了乱码,这令我很是惊讶。不过后来还是寻求了一个解决方案,就是设置当前编码为本地编码:viewplaincopytoclipboardprint?QTextCode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论