develop环境下qt中文化程序设计

更新时间:2023-12-18 12:07:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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字符编码的翻译文件.扩展名

为\在qt3.0.5环境下,打开\翻译文件的工具是linguist.你可以在\工具\菜单中选择\来打开,在linguist菜单中选择\

\打开所要翻译的翻译文件.此时可以在linguist窗口中的source text中

的文本就是你所要翻译的文本,选择所要翻译的文本,在下方有一个类似一页纸一样的地方,在translate下输入翻译后的文本.

所示.

翻译完这些文件后,编译运行,在我们的程序里并不能显示中文,还是英文,我们还需要做的就是用lrelease命令将翻译后的文件转换

成\文件才可以使用.在控制台下进入你用kdevelop所生成的应用程序目录.

lrelease Makefile.am qt3.0.5用这个两个程序取代了以前版本的findtr和msg2qm命令.在kdevelop集成环境中打开main.cpp主函数,

.

QApplication a(argc,argv); a.setFont(QFont(\; QTranslator tor(0);

tor.load(QString(\:locale(),\; //tor.load(QString(\; 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(\:locale(),\;

是根据客户环境的locale来载入当前目录下相应的翻译文件的.redhat中文环境默认的locale为gb18030,

此处要么把翻译文件名由qt1.zh_CN.GB2312.qm改为qt1.zh_CN.GB18030.qm,要么将这句改为

tor.load(QString(\;

不过为了国际化编程的需要,建议采用第一种方法.更改后编译运行,你会发现你的程序已经是中文界面的了.

2.汉化自己的对话框

大多数情况下我们都需要自己来设计对话框,qt为我们提供了非常好的对话框编辑器QtDesigner,可以很方便的设计我们的对话框,qt

的信号和槽等,关于QtDesigner的使用,限于篇幅,不再赘述.以前面的程序为基础.在kdevelop中选择\文件\新建\选择Qt Designer文件(*.ui).在文件名一栏中填写\最后点击确定按钮,即会启动QtDesigner,此处只拖了一个Label,写了一

些英文字符.对话框的name属性为Form1.将对话框mydialog.ui保存. 在控制台下进入你用kdevelop所生成的应用程序目录. lupdate Makefile.am

同样用\来翻译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(); 并将\

进去.依据前面的方法更改tor.load中加载的翻译文件.编译运行,你的对话框也是中文的了.

3.其它的一些说明

由于qt返回的是Unicode编码,譬如你在LineEdit中直接输入中文,返回的就是?,qt中可以直接使用QTextCodec来转换字符串的编码.

QString string;

string=LineEdit1-text();//取得LineEdit1返回的文字 QTextCodec*codec=QTextCodec:codecForName(\; //转换编码

QCString chinese_string=codec-fromUnicode(string);//用QCString来存储返回的多字节编码

当然,你在头文件中就必需加入 #include qtextcodec.h #include qstring.h

#include qcstring.h 4.QTextStream对中文的支持

QTextCodec*codec=QTextCodec:codecForName(\;/*当前编码为\

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(\;//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()的代码,它建立了一个弹出菜单,菜单项是\,它被放置在菜单条上,在菜单条上显示的是标签\。

QPopupMenu*popup;

popup=new QPopupMenu(this);

popup-insertItem(tr(\,qApp,SLOT(quit())); menubar-insertItem(tr(\,popup);

对于绝大多数情况,可以用上述方法处理。不过有时在定义某些变量中使用的字符串,不能使用上述方法,但是为了让Qt提取并翻译该字符串,必须用某种方法标志出来。Qt定义了QT_TR_NOOP()和QT_TRANSLATE_NOOP()来标志它们。前者用于单个字符串,后者用于多个字符串。比如,

static const char*strings={ QT_TR_NOOP(\, QT_TR_NOOP(\};

有时需要使用printf/sprintf之类的函数动态生成字符串,比如, QStings s;

s.sprintf(\,i); but-setText(s);

对这种使用方式的国际化是使用arg()函数。 QString s=tr(\; but-setText(s);

提取上述信息的方法是使用Qt提供的工具findtr命令: findtr[filename].cpp i18n.po

它类似于GNU的xgettext,上述文件的提取信息文件内包含, .

\:text/plain;charset=iso-8859-1\\n\#:i18n.cpp:34 msgid\:&File\msgstr\.

接下来是文本翻译过程。在Qt中翻译信息文件时应该注意以下事项:(1)提取的信息文件的编码是iso-8859-1,在翻译成某种语言(编码)时应该注意改动它的字符集,比如对中文GB2312和Big5编码,应该是,\:text/plain;charset=gb2312\\n\或者\:text/plain;charset=big5\\n\。(2)提取的信息有一个范围,比如上面的文件指定的范围是ExampleWidget,在翻译前应该把它去掉,变成msgid\:&File\。(3)被翻译的字符串可能含有加速键符号,如\中的\,如果翻译成中文最好保留该信息,它可以翻译成\文件(&F)\。

对于翻译后的文件(比如上面的翻译文件存为i18n_gb.po),必须使用Qt提供的工具msg2qm把它转换为.qm文件才能使用,

msg2qm i18n_gb.po i18n_gb.qm

它类似于GNU的msgfmt命令。翻译后的文件可以用Qt程序直接调用。 QTranslator*translator=new QTranslator(0); translator-load(\,\; qApp-installTranslator(translator);

此外,Qt还提供了类似于msgmerge的工具mergetr,它用于把新提取的信息文件和已经翻译过的信息文件融合起来,在此不再赘述。

在Qt中也可以直接使用QTextCodec来转换字符串的编码,这为在Qt下开发纯中文软件带来了便利条件,不过这种方法不符和国际化/本地化的习惯,

char*string=\中文和English混和字符串!\

QTextCodec*gbk_codec=QTextCodec:codecByName(\; QString gbk_string=codec-toUnicode(string); QLabel*label=new QLabel(gbk_string);

如果使程序只支持一种编码,也可以直接把整个应用程序的编码设置为GBK编码,然后在字符串之前加tr(QObject:tr),

qApp-setDefaultCodec(QTextCodec:codecForName(\; 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。以下是它的编码规则:

单字节:00~7F

双字节:A1~F7 A1~FE GBK的编码规则是: 单字节:00~7F

双字节:81~FE 40~7E 80~FE GB18030是最新的汉字编码标准,其编码为一、二、四变长编码:

单字节:00~7F

双字节:81~FE 40~7E 80~FE

四字节:81~FE 30~39 81~FE 30~39 Unicode编码采用等长编码,二个字节表示一个字符编码,对于ASCII码也采用双字节来表示,unicode使用二维空间来描述编码空间,平面分为256行、256列,对应于编码的高低字节。

二:Qt国际化编程

在文本显示上,Qt使用了Unicode作为内部编码,为了程序的国际化,通常我们在文本显示的地方不直接输入本地字符,用英文代替,比如要编写一中文界面的Qt程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。对于需要翻译的地方,首先是在该文本处用tr()函数标识,同时制作出.qm信息文件,并在程序中加入QTranslator即可。比如我们在某一程序中有如下语句:

setCaption(tr(\; 为了能显示中文,有两种方法: 方法一:

l修改工程文件,加上TRANSLATIONS=xxx.ts llupdate工程文件名 l用linguist编辑刚生成的xxx.ts文件并保存

l lrelease工程文件名xxx.qm l在main.cpp中加入QFont font1(\:Unicode);

qApp-setFont(font1);

QTranslator*translator=new QTranslator(0);

translator-load(\,\; qApp-installTranslator(translator); 方法二:

l findtr文件名(通常为CPP文件)xxx.po l编辑po文件,其中charset需由iso-8859-1改为GB2312,然后将\翻译成\主窗口\

l msg2qm– scope zh_CN.GB2312 xxx.po xxx.qm l在main.cpp中加入QFont font1(\:Unicode);

qApp-setFont(font1);

QTranslator*translator=new QTranslator(0); translator-load(\,\; qApp-installTranslator(translator); 方法三:

有时我们只是提供给本地用户使用,无需国际化,QT提供这一支持,在QT中有许多本地字符集同unicode的转换引擎,他们皆为QTextCodec的派生类,如QGbkCodec、QJisCodec,QHebrewCodec等。如:

QFont font1(\:Unicode); qApp-setFont(font1); QString caption=\主窗口\;

QTextCodec*gk_codec=QTextCodec:codecForName(\; setCaption(gk_codec-toUnicode(caption));

从上面可以看出,使用转换引擎可以轻松实现中文显示,简要步骤如下:

1:修改main.cpp文件,将字体改为unifont QFont font1(\:Unicode);

qApp-setFont(font1);

2:在想汉化的内的头文件中加入QTextCodec指针变量和转换函数QString mytr(char*)

#include qtextcodec.h QTextCodec*gbk; QString mytr(const char*);

3:在想汉化的类的实现文件中,修改类构造函数,加入: gbk=QTextCodec:codecForName(\;

4:在想汉化的类的实现文件中,添加mytr函数代码 QString Form1:mytr(const char*chars) {

return gbk-toUnicode(chars,strlen(chars)); }

5:在想汉化的类的实现文件中,用\替换\

2004-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(\; return gbk-toUnicode(buffer,size); }

4:在需要显示中文的地方,使用mytr函数即可 5:修改main.cpp文件,将字体改为unifont QFont font1(\:Unicode);

qApp-setFont(font1);

备注:在翻译或转换之前必须将Unicode字体调入,否则显示不出中文,网上相关文章并未提及这一点,如果不显式装载该字体,系统默认的是Latin1,于是汉字显不出来。

备注2:在编译qt/embedded之前,必须修改qconfig-qpe.h配置文件的内容,将与TextCodec相关的宏定义给去掉,否则QTextCodec:codecForName(\将返回NULL指针。

备注3:使用findtr命令时可同时查找多个文件的tr(),并将查找结果都放入一个文件内,源文件以空格隔开即可,另外,生成的.po和.qm文件的文件名最好与工程文件名相同!

备注4:如果要显示繁体中文,则需要使用QTextCodec:

codecForName(\。获取本地的使用语言,用QTextCodec:locale(),它返回Qstring变量,通常如果是中文本地的话,通常其值为zh_CN.GB2312和zh_TW.Big5,根据这个返回字符串,可以加载相应的codec。如果程序只支持一种编码,也可以直接把整个应用程序的编码设置为一个默认的编码标准,比如

系统只需要显示中文和英文,则可以直接设置应用程序的默认编码标准是GBK,如下使用方法:

qApp-setDefaultCodec(QTextCodec:codecForName(\; 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和Name[zh_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的过程中,可能会报告找不到SetButtonGroupID()函数,编译通不过。这是由于库中并没有该函数,一般情况下将该语句隐藏掉,原代码的原意是设置Button按钮在ButtonGroup组的序号,隐藏该语句对应用无影响。出现这个问题,主要在/netsetup/dialup/dialupbase.cpp文件和/taskbar/shutdown.cpp文件,shutdown.cpp文件的相应行号是:96、149、201、253行。

2.修改mpegplayer/playlistwidget.cpp文件的143行和166行,将字体设置改为Unifont,如下:Qfont(\:Unicode)或者去掉该语句

3.修改snake/interface.cpp的87行和186行,将字体设置改为Unifont,如下:Qfont(\:Unicode)或者去掉该语句

4.修改qasteroids/view.cpp的104行和qasteroids/toplevel.cpp的109行和165行,将字体设置改为Unifont,如下:

Qfont(\:Unicode)或者去掉该语句

5.修改sysinfo/versioninfo.cpp文件,将61行的builder改为作者本人,将50行的v改为tr(\,重新建立po文件,并翻译corpname为国营789北京开发部,使用msg2qm生成qm文件

6.修改桌面,位于taskbar目录下,生成libqpe.po和libqpe.qm文件,并将libqpe.qm文件拷贝到i18n/zh_CN目录下

五:qtopia目录结构

apps/Applications:应用程序桌面配置文件 apps/Games:游戏桌面配置文件 apps/Settings:系统设置桌面配置文件 bin:二进制可执行文件 configs:编译配置文件目录 doc和docs:qtopia的参考文档 etc:应用配置文件目录 i18n:国际化目录 i18n/zh_CN:简体中文目录

include/qpe:与qtopia相关的头文件目录 inputmethods:输入法

library:qtopia部分源代码目录 pics:与应用相关的图片存放目录

plugins:各种插件目录,如mpeg3解码插件、输入法插件等 sounds:音频文件存放目录

taskbar:桌面程序的源代码(qpe的源代码) 文件修改记录:

1:创建于2003/6/9 2:于2003/8/21添加实现中文显示的第三种方法部分

3:于2004-1-18添加文章的\四\内容,一个汉化qtopia for arm的实例,以及\五\。

特别声明: 1:资料来源于互联网,版权归属原作者 2:资料内容属于网络意见,与本账号立场无关 3:如有侵权,请告知,立即删除。

本文来源:https://www.bwwdw.com/article/uqt5.html

Top