Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103653053
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-04-29 15:19:03

 
kdevelop是一款在linux平台下可以同windows环境下的vc相媲美的集成开发环境,qt则是一款支持包括windows和linux平台
的GUI库,可以说它是linux下的MFC.在显示上,qt使用Unicode作为内部编码,可以支持多种编码.如何使用qt进行国际化编程
在网上可以找到很多资料的,但都是针对较早版本的qt进行介绍的.qt3.0.5中对这些作了些改动,这些方法就相应的要做些改动.
而且在kdevelop中开发qt应用程序,将会事半功倍.我的开发环境为redhat8.0(需安装kde开发工具包).
首先在linux中打开kdevelop集成开发环境,用它的应用程序向导新建一个qt的SDI的应用程序框架.这个同windows下vc很类似.它
将会为你自动生成版本号,作者,e-mail等信息的单文档对话框的应用程序框架.我们首先对它自动生成的程序进行汉化(qt1是
我的项目名称).
1.汉化自动生成的程序
添加翻译文件
在"项目"菜单中选择"添加新的翻译文件",语言选择"zh_CN.Gb2312".将会创建一个zh_CN.GB2312字符编码的翻译文件.扩展名
为".ts".在qt3.0.5环境下,打开"*.ts"翻译文件的工具是linguist.你可以在"工具"菜单中选择"QT
linguist"来打开,在linguist菜单中选择"file"->"open"打开所要翻译的翻译文件.此时可以在linguist窗口中的source text中
的文本就是你所要翻译的文本,选择所要翻译的文本,在下方有一个类似一页纸一样的地方,在translate下输入翻译后的文本.
所示.
翻译完这些文件后,编译运行,在我们的程序里并不能显示中文,还是英文,我们还需要做的就是用lrelease命令将翻译后的文件转换
成".qm"文件才可以使用.在控制台下进入你用kdevelop所生成的应用程序目录.
>lrelease Makefile.am
qt3.0.5用这个两个程序取代了以前版本的findtr和msg2qm命令.在kdevelop集成环境中打开main.cpp主函数,
......
QApplication a(argc, argv);
a.setFont(QFont("helvetica", 10));
QTranslator tor( 0 );
tor.load( QString("qt1.") + QTextCodec::locale(), "." );
// tor.load( QString("qt1.zh_CN.GB2312"), "." );
a.installTranslator( &tor );
/* uncomment the following line, if you want a Windows 95
look*/
// a.setStyle(WindowsStyle);

Qt1App *qt1=new Qt1App();
//Form1 *qt1=new Form1();
a.setMainWidget(qt1);
......
此处:
tor.load( QString("qt1.") + QTextCodec::locale(), "." );
是根据客户环境的locale来载入当前目录下相应的翻译文件的.redhat中文环境默认的locale为gb18030,
此处要么把翻译文件名由qt1.zh_CN.GB2312.qm改为qt1.zh_CN.GB18030.qm,要么将这句改为
tor.load( QString("qt1.zh_CN.GB2312"), "." );
不过为了国际化编程的需要,建议采用第一种方法.更改后编译运行,你会发现你的程序已经是中文界面的了.

2.汉化自己的对话框
大多数情况下我们都需要自己来设计对话框,qt为我们提供了非常好的对话框编辑器QtDesigner,可以很方便的设计我们的对话框,qt
的信号和槽等,关于QtDesigner的使用,限于篇幅,不再赘述.以前面的程序为基础.在kdevelop中选择"文件"->"新建",选择Qt
Designer文件(*.ui).在文件名一栏中填写"mydialog",最后点击确定按钮,即会启动QtDesigner,此处只拖了一个Label,写了一
些英文字符.对话框的name属性为Form1.将对话框mydialog.ui保存.
在控制台下进入你用kdevelop所生成的应用程序目录.
>lupdate Makefile.am
同样用"QT
linguist"来翻译qt1.zh_CN.GB2312.tr文件.此时linguist的context中会多出Form1的选项,这里面就是我们新建的对话框要翻译的
选项.依据前面的方法进行汉化.
>lrelease Makefile.am
生成qt1.zh_CN.GB2312.qm文件.
编译将会生成mydialog.cpp mydialog.h mydialog.moc文件.然后将main.cpp中的
Qt1App *qt1=new Qt1App();改为
Form1 *qt1=new Form1();
并将"mydialog.h" #include
进去.依据前面的方法更改tor.load中加载的翻译文件.编译运行,你的对话框也是中文的了.

3.其它的一些说明
由于qt返回的是Unicode编码,譬如你在LineEdit中直接输入中文,返回的就是??,qt中可以直接使用QTextCodec来转换字符串的编码.
QString string;
string=LineEdit1->text(); //取得LineEdit1返回的文字
QTextCodec *codec=QTextCodec::codecForName("GBK");
//转换编码
QCString
chinese_string=codec->fromUnicode(string);//用QCString来存储返回的多字节编码
当然,你在头文件中就必需加入
#include
#include
#include

4.QTextStream对中文的支持
QTextCodec* codec = QTextCodec::codecForName("GBK"); /* 当前编码为"GBK" */
QTextStream mystream(&file);
mystream.setCodec(codec);

5. QCString&QString
QCString中不以unicode编码
QString以unicode为编码.
qt内部使用unicode为编码,所以如果要在qt的部件如multilineedit中显示中文,则需要将非unicode的字符转换成unicode字符.
QCString locallyEncoded = "中国人不是东亚病夫"; // text to convert
QTextCodec *codec = QTextCodec::codecForName("GBK"); // get the codec for GBK
QString unicodeString = codec->toUnicode( locallyEncoded );

阅读(220) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~