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 还不支持动态切换编码输入的支持,这是它的不足之处。

Qt 的文本显示使用Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。比如要编写一中文界面的Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。这样,程序还可以根据Locale的不同,支持多种语言。下面介绍如何在Qt 程序中标注字符串,如何提取并翻译文本。

像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数QObject::tr(),它用于从Qt的信息文件.qm 中取出信息,这些信息是经过Qt 的工具处理的。Qt 在处理编码时还使用了QTranslator 类,可用于指定整个应用软件的信息文件。

下面是一段使用了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);

相关推荐
相关主题
热门推荐