develop环境下qt中文化程序设计.doc_第1页
develop环境下qt中文化程序设计.doc_第2页
develop环境下qt中文化程序设计.doc_第3页
develop环境下qt中文化程序设计.doc_第4页
develop环境下qt中文化程序设计.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

develop环境下qt中文化程序设计转develop环境下qt中文化程序设计2010-10-21 15:03原文出处:Linux公社原文作者:yfy001 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 aWindows 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 qtextcodec.h#include qstring.h#include qcstring.h 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);国际化编程内容:1.Qt的文本显示2.Qt的文本输入3.Qt的打印于明俭2002年1月09日本篇讨论Qt库对国际化的支持,将介绍Qt对文本显示,输入和打印的支持,和如何使用Qt开发国际化的软件。Qt目前的版本(2.2.4)对国际化的支持已经相当完善。在文本显示上,Qt使用了Unicode作为内部编码,可以同时支持多种编码。为Qt增加一种编码的支持也比较方便,只要增加该编码和Unicode的转换编码便可以了。Qt目前支持ISO标准编码ISO 8859-1,ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,ISO 8859-9,和ISO 8859-15(对于阿拉伯语和希伯来语的支持正在开发之中),中文GBK/Big5,日文eucJP/JIS/ShiftJIS,韩文eucKR,俄文KOI8-R。当然也可以直接使用UTF8编码。Qt使用了自己定义的Locale机制,在编码支持和信息文件(Message File)的翻译上弥补了目前Unix上所普遍采用Locale和gettext的不足之处。Qt的这种机制可以使Qt的同一组件(QWidget)上同时显示不同编码的文本。比如,Qt的标签上可以同时使用中文简体和中文繁体文本。在文本输入上,Qt采用了XIM(X Input Method)标准协议,可以直接使用XIM输入服务器。由于目前的绝大多数输入服务器都是针对单一语言的,所以在Qt的标准输入组件(QLineEdit,QMultiLineEdit)中的输入受到单一编码的限制,Qt还不支持动态切换编码输入的支持,这是它的不足之处。1.Qt的文本显示像普通的国际化过程一样,Qt使用了类似GNU gettext一样的函数QObject:tr(),它用于从Qt的信息文件.qm中取出信息,这些信息是经过Qt的工具处理的。Qt在处理编码时还使用了QTranslator类,可用于指定整个应用软件的的信息文件。使用Qt编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。比如要编写一中文界面的Qt程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。这样,程序还可以根据Locale的不同,支持多种语言。下面介绍如何在Qt程序中标注字符串,如何提取并翻译文本。下面是一段使用了QObject:tr()的代码,它建立了一个弹出菜单,菜单项是Quit,它被放置在菜单条上,在菜单条上显示的是标签File。QPopupMenu*popup;popup=new QPopupMenu(this);popup-insertItem(tr(&Quit),qApp,SLOT(quit();menubar-insertItem(tr(&File),popup);对于绝大多数情况,可以用上述方法处理。不过有时在定义某些变量中使用的字符串,不能使用上述方法,但是为了让Qt提取并翻译该字符串,必须用某种方法标志出来。Qt定义了QT_TR_NOOP()和QT_TRANSLATE_NOOP()来标志它们。前者用于单个字符串,后者用于多个字符串。比如,static const char*strings=QT_TR_NOOP(Hello),QT_TR_NOOP(World);有时需要使用printf/sprintf之类的函数动态生成字符串,比如,QStings s;s.sprintf(Button%d,i);but-setText(s);对这种使用方式的国际化是使用arg()函数。QString s=tr(Button%1).arg(i);but-setText(s);提取上述信息的方法是使用Qt提供的工具findtr命令:findtrfilename.cpp i18n.po它类似于GNU的xgettext,上述文件的提取信息文件内包含,.Content-Type:text/plain;charset=iso-8859-1n#:i18n.cpp:34 msgidExampleWidget:&Filemsgstr.接下来是文本翻译过程。在Qt中翻译信息文件时应该注意以下事项:(1)提取的信息文件的编码是iso-8859-1,在翻译成某种语言(编码)时应该注意改动它的字符集,比如对中文GB2312和Big5编码,应该是,Content-Type:text/plain;charset=gb2312n或者Content-Type:text/plain;charset=big5n。(2)提取的信息有一个范围,比如上面的文件指定的范围是ExampleWidget,在翻译前应该把它去掉,变成msgid:&File。(3)被翻译的字符串可能含有加速键符号,如&File中的F,如果翻译成中文最好保留该信息,它可以翻译成文件(&F)。对于翻译后的文件(比如上面的翻译文件存为i18n_gb.po),必须使用Qt提供的工具msg2qm把它转换为.qm文件才能使用,msg2qm i18n_gb.po i18n_gb.qm它类似于GNU的msgfmt命令。翻译后的文件可以用Qt程序直接调用。QTranslator*translator=new QTranslator(0);translator-load(i18n_gb.qm,.);qApp-installTranslator(translator);此外,Qt还提供了类似于msgmerge的工具mergetr,它用于把新提取的信息文件和已经翻译过的信息文件融合起来,在此不再赘述。在Qt中也可以直接使用QTextCodec来转换字符串的编码,这为在Qt下开发纯中文软件带来了便利条件,不过这种方法不符和国际化/本地化的习惯,char*string=中文和English混和字符串!QTextCodec*gbk_codec=QTextCodec:codecByName(GBK);QString gbk_string=codec-toUnicode(string);QLabel*label=new QLabel(gbk_string);如果使程序只支持一种编码,也可以直接把整个应用程序的编码设置为GBK编码,然后在字符串之前加tr(QObject:tr),qApp-setDefaultCodec(QTextCodec:codecForName(GBK);QLabel*label=new QLabel(tr(中文标签);如果使Qt根据Locale的环境变量取得字符集,可以使用QString:fromLocal8Bit(str)。本节的例子请参见qt-i18n-example.tar.gz 2.Qt的文本输入在输入方面,Qt的输入条(QLineEdit)和编辑区(QMultiLineEdit)都支持XIM,只要配合相应的输入服务器,便可以输入中文/日文/韩文。目前有许多支持XIM的软件,比如中文:Chinput/xcin/rfinput/q9,日文:kinput2/skkinput,韩文:ami/hanIM。Qt程序的缺省输入风格是OverTheSpot风格,它也支持OffTheSpot风格和Root风格。用户可以在起动程序时在命令行指定输入风格,比如对程序app,./app-inputstyle overthespot#缺省风格,光标跟随./app-inputstyle offthespot./app-inputstyle root经过MiziLinux补丁的Qt-2.2.0支持OnTheSpot输入风格,并且把它作为缺省的输入风格。请参见。Qt中的任何一个Widget都可以接受输入,只要它可以有键盘聚焦(Keyboard Focus)。所以对特殊Widget的输入处理只需要截获键盘输入,获取从XIM服务器来的字符串。对于OverTheSport风格的支持,刷新XIM输入服务器的位置即可。3.Qt的打印在打印方面,XWindow下的Qt生成PostScript并使用lpr打印。它含有QPrinter类,可以方便地支持输出页面的控制。对于中文打印,必须修正PostScript文件的输出部分。TOpia中文化一:字符集介绍我国已经颁布了多种中文信息编码标准,常用的有:GB2312-1980、GB12345、GB13000(GBK)以及最新标准GB18030,其中GB13000是对GB2312的扩展,又常被成为GBK,GB18030向下兼容GB2312和GBK,中文WINDOW98、中文WIN2000操作系统采用的中文字符集是GB2312。GB2312字库仅覆盖双字节部分,存储位置索引是编码中每字节的第8 bit置0得来的,如A1A1编码汉字在字库中的索引是2121,而非A1A1。以下是它的编码规则:单字节:007F双字节:A1F7 A1FE GBK的编码规则是:单字节:007F双字节:81FE 407E 80FE GB18030是最新的汉字编码标准,其编码为一、二、四变长编码:单字节:007F双字节:81FE 407E 80FE四字节:81FE 3039 81FE 3039 Unicode编码采用等长编码,二个字节表示一个字符编码,对于ASCII码也采用双字节来表示,unicode使用二维空间来描述编码空间,平面分为256行、256列,对应于编码的高低字节。二:Qt国际化编程在文本显示上,Qt使用了Unicode作为内部编码,为了程序的国际化,通常我们在文本显示的地方不直接输入本地字符,用英文代替,比如要编写一中文界面的Qt程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。对于需要翻译的地方,首先是在该文本处用tr()函数标识,同时制作出.qm信息文件,并在程序中加入QTranslator即可。比如我们在某一程序中有如下语句:setCaption(tr(main window);为了能显示中文,有两种方法:方法一:l修改工程文件,加上TRANSLATIONS=xxx.ts llupdate工程文件名l用linguist编辑刚生成的xxx.ts文件并保存l lrelease工程文件名xxx.qm l在main.cpp中加入QFont font1(unifont,16,50,FALSE,QFont:Unicode);qApp-setFont(font1);QTranslator*translator=new QTranslator(0);translator-load(xxx.qm,.);qApp-installTranslator(translator);方法二:l findtr文件名(通常为CPP文件)xxx.po l编辑po文件,其中charset需由iso-8859-1改为GB2312,然后将main window翻译成主窗口l msg2qm scope zh_CN.GB2312 xxx.po xxx.qm l在main.cpp中加入QFont font1(unifont,16,50,FALSE,QFont:Unicode);qApp-setFont(font1);QTranslator*translator=new QTranslator(0);translator-load(xxx.qm,.);qApp-installTranslator(translator);方法三:有时我们只是提供给本地用户使用,无需国际化,QT提供这一支持,在QT中有许多本地字符集同unicode的转换引擎,他们皆为QTextCodec的派生类,如QGbkCodec、QJisCodec,QHebrewCodec等。如:QFont font1(unifont,16,50,FALSE,QFont:Unicode);qApp-setFont(font1);QString caption=主窗口;QTextCodec*gk_codec=QTextCodec:codecForName(GBK);setCaption(gk_codec-toUnicode(caption);从上面可以看出,使用转换引擎可以轻松实现中文显示,简要步骤如下:1:修改main.cpp文件,将字体改为unifont QFont font1(unifont,16,50,FALSE,QFont:Unicode);qApp-setFont(font1);2:在想汉化的内的头文件中加入QTextCodec指针变量和转换函数QString mytr(char*)#include qtextcodec.h QTextCodec*gbk;QString mytr(const char*);3:在想汉化的类的实现文件中,修改类构造函数,加入:gbk=QTextCodec:codecForName(GBK);4:在想汉化的类的实现文件中,添加mytr函数代码QString Form1:mytr(const char*chars)return gbk-toUnicode(chars,strlen(chars);5:在想汉化的类的实现文件中,用mytr替换tr2004-12-2测试了上面的方法三,编译通过,如果将codec成员变量改成QTextCodec派生类变量,编译将通不过,比如将QTextCodec*gbk;改成QGbkCodec*gbk;编译将报告此处有语法错误。下面是相似的用法:1:修改*.cpp文件,在顶部加入codec头文件#include qgbkcodec.h 2:在*.h文件中,加入mytr()函数声明QString mytr(char*buffer,int size);3:在*.cpp文件中,加入mytr()定义QString mytr(char*buffer,int size)QGbkCodec*gbk=QTextCodec:codeForName(GBK);return gbk-toUnicode(buffer,size);4:在需要显示中文的地方,使用mytr函数即可5:修改main.cpp文件,将字体改为unifont QFont font1(unifont,16,50,FALSE,QFont:Unicode);qApp-setFont(font1);备注:在翻译或转换之前必须将Unicode字体调入,否则显示不出中文,网上相关文章并未提及这一点,如果不显式装载该字体,系统默认的是Latin1,于是汉字显不出来。备注2:在编译qt/embedded之前,必须修改qconfig-qpe.h配置文件的内容,将与TextCodec相关的宏定义给去掉,否则QTextCodec:codecForName(GBK)将返回NULL指针。备注3:使用findtr命令时可同时查找多个文件的tr(),并将查找结果都放入一个文件内,源文件以空格隔开即可,另外,生成的.po和.qm文件的文件名最好与工程文件名相同!备注4:如果要显示繁体中文,则需要使用QTextCodec:codecForName(big5)。获取本地的使用语言,用QTextCodec:locale(),它返回Qstring变量,通常如果是中文本地的话,通常其值为zh_CN.GB2312和zh_TW.Big5,根据这个返回字符串,可以加载相应的codec。如果程序只支持一种编码,也可以直接把整个应用程序的编码设置为一个默认的编码标准,比如系统只需要显示中文和英文,则可以直接设置应用程序的默认编码标准是GBK,如下使用方法:qApp-setDefaultCodec(QTextCodec:codecForName(GBK);QLabel*label=new QLabel(tr(中文标签);备注5:如果使用本地的字符转换器,可以使用Qstring的静态函数Qstring:fromLocal8Bit(char*buffer,int size),将本地字符串转换成UNICODE字符串,不过要设置好LANGUAGE环境变量。三:QTOpia中文化l findtr文件名xxx.po l编辑xxx.po文件l msg2qm scope zh_CN.GB2312 xxx.po xxx.qm l拷贝可执行文件到QPEDIR/bin目录l拷贝xxx.po和xxx.qm文件到QPEDIR/i18n/zh_CN目录l进入QPEDIR/apps/Applications目录创建一新.desktop文件l iconv futf8 tGB18030 xxx.desktop xxx1.desktop l编辑xxx1.desktop文件,主要是修改Exec、Icon、Name和Namezh_CN四项l iconv fGB18030 tutf8 xxx1.desktop xxx.desktop lrm fxxx1.desktop lqvfb depth 16&l cd$QPEDIR/bin l./qpe备注:如果你的系统中有多个qtopia版本,要特别注意QTDIR、QPEDIR、LD_LIBRARY_PATH环境变量备注2:可按照此方法汉化qtopia自带的应用程序备注3:po文件是中间文件,程序真正需要的是qm文件。iconv是系统自带的内码转换工具,它能将utf8编码的文件转换成gb18030编码的文件,反之也能,转换这一步必不可少,因为desktop文件缺省是utf8编码的,而我们的redhat linux 7。3中文操作系统用的却是gb18030,所以在编辑器打开前需转换。四:汉化qtopia-1.5.0 for Arm首先按照三的方法对要汉化的程序提取*.qm文件和*.desktop桌面配置文件,在做完这一步后,将*.qm文件down到目标机的/opt/qtopia-free-1.5.0.arm/i18n/zh_CN目录下,同时将*.desktop文件覆盖/opt/qtopia-free-1.5.0.arm/apps目录下的相应文件,目标机的环境变量配置如下:export QTDIR=/opt/qt-2.3.3.arm export QPEDIR=/opt/qtopia-free-1.5.0.arm export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export PATH=$QPEDIR/bin:$PATH export LANG=zh_CN开机启动,由于设置的语言为简体中文,qpe会自动为每个应用加载Unifont字体,以及简体中文目录下的翻译文件,因而显示出中文,翻译文件是一个方面,但更关键的是要显示中文必须有中文字体来支持,Unifont字体包含中文字,因而能显示中文,没有相应字体的支持,光有翻译文件是显示不出中文的!在经过以上的步骤后,有的应用在显示上依然会显示方框,这多半是由于该窗体相关的字体可能不是支持中文的字体,这需要直接修改源代码,以下是在汉化qtopia-free-1.5.0.arm的过程中的相关记录:1.在编译qtopia的过程中,可能会报告找不到SetButton

温馨提示

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

评论

0/150

提交评论