[qt topic] –
中文化研习做一个多语言的简易天气预报器
作者
jason lee
日期
2010-04-01
-- 2010-04-02
平台
qt sdk v2010.02.1 + windows xp
声明 文章作者仅在intel软件网络
和csdn博客
发表本文如有转载请注明出处。
[1]
简单地使用
qtextcodec
和
tr
配合
在默认情况下我们直接在源码中使用中文比如
setwindowtitle(tr("
中文化研习
"));
则会在运行界面发现中文乱码。遇到这种问题如果无需考虑国际化则可以直接使用
设置编码方式
qtextcodec::setcodecfortr(qtextcodec::codecforname("gb18030"));
该语句需要包含头文件
#include <qtextcodec>
。
选择
gb18030
而不是
gbk
或者
gb2312
是因为前者的汉字收录更丰富并向下兼容了后两者。但是在嵌入式设备上如手机或
mp3
并不一定支持
而既然是
setcodecfortr
那么就应该在第一次对
tr()
的调用之前设置编码方式一般应该在
main()
函数中紧接
qapplication
对象创建后设置。
用来返回一个翻译过的文本版本在编写代码的过程中对每一个用户可见的文本都应该加上该函数。
这样设置了以后基本的中文显示如按钮文本、窗口标题以及文本编辑区域都可以得到良好的显示。
值得一提的是如果出现的不是乱码而是问号则可能是字符编码内无该字的编码。另外一种问题是如果出现的是方框正方形而不是乱码则可能是无该指定字体可以通过设置
qfont
尝试解决该问题。
[2]
关于使用
qstring
来显示中文
一是使用
tolocal8bit
fromlocal8bit
。比如下述代码就可以良好地显示中文
qstring gbtext;
gbtext = gbtext.fromlocal8bit("汉化");
btn = new qpushbutton(gbtext);
通过这种方式可以使用系统的本地
8
位编码格式。
二是通过
结合设置在
const char *
之间转换时使用的编码格式比如下述代码也可以使得汉字良好显示
qtextcodec::setcodecforcstrings(qtextcodec::codecforname("gb18030"));
qstring str = "汉化";
textedit->append(str);
[3]
使用
qt
翻译家
提供了外部的翻译文件只要对需要进行翻译的文本使用
函数然后在
.pro
工程文件中添加
translations = localizer.ts
这里的文件名自然要根据具体需要设置。之后使用
lupdate
命令如
lupdate localizer.pro
生成
localizer.ts
。接着用
linguist
打开
并在文件里面进行相应文本的翻译保存后发布生成
localizer.qm
至此在包含了头文件
#include <qtranslator>
后即可以安装翻译家将相应的文本进行翻译
qtranslator translator;
translator.load(":/localizer");
app.installtranslator(&translator);
此时再运行程序则可以发现界面上的文本已经得到翻译了。
补充在上述代码中
是由
qrc
文件指定位置的本例中
相对于
文件的位置是“
/localizer.qm
”所以添加的时候使用“
:/localizer
”。而如果
qm
文件相对于
/translator/localizer.qm
”则需要指定为“
:/translator/localizer.qm
”。
[4]
文件读写中的中文
这里以读取
的天气
api
为例。
的中文天气
为
http://www.google.com/ig/api?hl=zh_cn&weather=
等号后面加城市名比如“
beijing
”或者“
hongkong
该
是以
xml
格式给出信息而如果我们不加以修饰地直接读取该
文件的话则会出现如“
é£
åï
¼ ä
¸åã
é
”之类的乱码。
针对这种情况可以先使用不一定必须使用
存放信息因为可以用
对
进行编码格式的设置
qtextcodec::setcodecforcstrings(qtextcodec::codecforname("utf-8"));
这样的话就可以以相应的编码格式进行文件读取。运行后可以看到中文显示正常。
同样地使用其它方式进行文件读取的话也可以使用类似设置编码格式的方法。比如使用
qtextstream
时如果希望使用特定的编码进行读写则可以使用该类的成员函数
setcodec()
[5]
可动态切换语言的天气预报器
关于这个话题可以精炼成以下几点具体的完整代码将会在后面给出
1
、动态的语言切换的实现是通过在运行时用户进行语言选择时触发的信号引起相应槽的运作。比如可以设置一个语言菜单供用户选择语言我在这里只设置了英语和中文。当用户点击菜单选项的时候利用
qtranslator
进行不同
文件的重新载入然后再重绘可见文本。所以这就要求一是用户可见的文本应该用
函数处理毕竟这不是一样很大的负担最好将其养成习惯二是生成用户可见文本的代码最好放在一个函数里为了取名有意义可以取做
retranslateui()
void qwr::retranslateui(){
enact->settext(tr("&english"));
cnact->settext(tr("&chinese"));
languagemenu->settitle(tr("&language"));
citylabel->settext(tr("city"));
runbtn->settext(tr("&run"));
setwindowtitle(tr("qweatherreporter"));
}
2
、天气预报的功能是通过调用
google api
实现的需要注意的是温度单位在国内外的不同。如果当前用户选择英文就选择英文
同样的如果用户选择中文就设置
url
为中文
地址。这就需要在编码的时候进行判断判断的方式有多种。
qstring url;
if(cnact->ischecked()){
url = "http://www.google.com/ig/api?hl=zh_cn&weather=";
url.append(citybox->text());
}else{
url = "http://www.google.com/ig/api?hl=en&weather=";
request.seturl(qurl(url));
3
、
天气
给的结果是
格式的所以参考
中提到的要设置编码格式。正确读取
数据后再根据结点名称获取具体的天气数据如最高温、最低温以及日期等。
qtextcodec::setcodecforcstrings(qtextcodec::codecforname("utf-8"));
qstring xmlfile = reply->readall();
if(xmlfile.size() < 1000){ //error city information
resultbox->settext("no such city!");
return ;
4
、最后就是将天气预报的结果呈现出来。
[
结语
]
这个小程序我给放到了
http://qwr.sf.net
各位如果有兴趣去可以下载完整源码。由于陆续有朋友邮件我说需要源码其实sf.net上有所以我给放到了csdn资源上地址为http://download.csdn.net/source/2231965
[补充]后来我在写一个程序的时候发现使用gb18030或者gbk、gb2312也一样在我的机子上运行是ok的但是拿到其他机子同样的系统却出现了乱码这令我很是惊讶。不过后来还是寻求了一个解决方案就是设置当前编码为本地编码
qtextcodec::setcodecfortr(qtextcodec::codecforlocale());
qtextcodec::setcodecforcstrings(qtextcodec::codecforlocale());
这可能是楼下的朋友提出的不管输什么城市都是“no such city”的原因可以如此修改一番。