• 8350阅读
  • 8回复

[提问]Qt 4.4.3中文显示? [复制链接]

上一主题 下一主题
离线shuminhua
 

只看楼主 倒序阅读 楼主  发表于: 2010-03-16
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
openSUSE 11.1中的QT4.4.3开发界面,如何使菜单及窗口标题栏显示为中文?谢谢!
QQ: 398827954
Email: shuminhua@126.com;shuminhua23@hotmail.com
http://www.pumpliu.com/bbs/userspace.asp?sid=4
离线yangfanxing
只看该作者 1楼 发表于: 2010-03-16
个人推荐translate
搜索老帖“中文”二字
PHPWind好恶心。。。不想看这种界面。。。
离线benbenmajia

只看该作者 2楼 发表于: 2010-03-17
怎么这么多这个帖子,还是一个人发的
安然.....
离线shuminhua

只看该作者 3楼 发表于: 2010-03-23
谢谢!现在解决了!
在main.cpp中加入如下代码,就可以都显示中文了:
#include  <QTextCodec>

    QApplication app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName(“GB2312” ));
    QTextCodec::setCodecForLocale (QTextCodec::codecForName( “GB2312”));
QQ: 398827954
Email: shuminhua@126.com;shuminhua23@hotmail.com
http://www.pumpliu.com/bbs/userspace.asp?sid=4
离线shuminhua

只看该作者 4楼 发表于: 2010-03-23
出现这样一个问题:
在main.cpp中加入如下代码,则对话框标题、标签及按钮名称等就可以显示中文,但是MainWindow所创建的主窗口的标题及菜单栏都不能显示中文;
    #include  <QTextCodec>

     QApplication app(argc, argv);
     QTextCodec::setCodecForTr(QTextCodec::codecForLocale( ));
     QTextCodec::setCodecForCStrings (QTextCodec::codecForLocale( ));

后修改为:
#include  <QTextCodec>

    QApplication app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName(“GB2312” ));
    QTextCodec::setCodecForLocale (QTextCodec::codecForName( “GB2312”));
就都可以显示了!是什么原因呢?
QQ: 398827954
Email: shuminhua@126.com;shuminhua23@hotmail.com
http://www.pumpliu.com/bbs/userspace.asp?sid=4
离线yangfanxing
只看该作者 5楼 发表于: 2010-03-23
选对字符集了啊~
PHPWind好恶心。。。不想看这种界面。。。
离线drylake
只看该作者 6楼 发表于: 2010-03-23
我说说自己的想法,有异议请拍砖。

中文其实只有在几种情况才能良好的显示。

对于标准Unicode,无论是USC2或者是UCS4都是没有问题的。但是对汉字排序不佳,根本没有考虑拼音检索排序的问题。
GB2312就是应付这种情况出现的编码方式,它对汉字的排序是按照音节的,排序优秀,兼顾繁体,因此建议在类似电话本和vCard&vCal的编解码时使用。
在微软的环境下有一个函数不知道各位是有印象:MultiBtyeToWChar(),大概是这样吧。
MultiByte中常用的就是UTF-8和微软自己的ANSI编码,前者是变长编码,可以保存汉字,在对字符文件进行保存时优选编码。
后者是系统在程序运行时的一种临时编码,也可以在程序内传输和打印汉字,效率比较高,但不建议新手使用。
离线shuminhua

只看该作者 7楼 发表于: 2010-03-25
又出问题了!本来已经都可以显示中文了,但后来不知道怎么就出现这种情况了!
使用如下代码时,主界面标题及菜单栏可现实为中文,但子对话框的标题、标签及按钮上的中文显示为乱码:
#include  <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));

#include  <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));

QTextCodec::setCodecForTr(QTextCodec::codecForLocale( ));
QTextCodec::setCodecForCStrings (QTextCodec::codecForLocale( ));


但使用如下代码时,子对话框的标题、标签及按钮上可显示中文,但主界面窗口的标题及菜单栏中文显示为乱码:
    #include  <QTextCodec>

QApplication app(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale( ));
QTextCodec::setCodecForCStrings (QTextCodec::codecForLocale( ));

后来发现凡是mainwindow.cpp文件内的中文都可以显示。于是,试了一下,将Control对话框的Control_Standarddialogs.cpp文件的内容拷贝到mainwindow.cpp文件中,然后撤掉Control_Standarddialogs.cpp重新编译,则Control对话框可以显示中文,而其他的对话框还是乱码。这是什么原因?该如何解决?
谢谢!
QQ: 398827954
Email: shuminhua@126.com;shuminhua23@hotmail.com
http://www.pumpliu.com/bbs/userspace.asp?sid=4
离线guyanqiu
只看该作者 8楼 发表于: 2010-03-26
#include  <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
在Debug版本时可以正常显示中文,但是变成Release版本时,就会使标题栏乱码。
主要解决办法:
作为非英语国家人员开发的类库,QT有充分的理由优先考虑支持Unicode和各国自定义字库编码。大家也知道了QT对软件Internationalization有一套完整的开发模型,包括专门为此写的linguist程序。但是如果我们的软件只运行在中文系统下,最简单的方法是什么呢?最简单的方法,就是在main函数中调用QTextCodec::setCodecForTr( QTextCodec::codecForName("GBK") );就可以了。记得这句要在所有使用tr的语句前调用。以后在需要使用中文的地方使用tr("中文字符");就可以了。相信许多老MFCer都知道_T("")的用法,tr感觉类似一些,而且以后想做其它语言版本时还可以在linguist程序中翻译。
但事情真的这么简单吗?当我将一个测试程序拷贝到一台没装过Qt的电脑上时,tr中的字都显示不了了。奇怪的是用Creater IDE生成的UI界面中的汉字能正常显示。看了qmake生成ui的.h文件,发现那些中文字符已经被自动转换成UTF8 encoding了。奇怪的是,QTextCodec::setCodecForTr( QTextCodec::codecForName("GBK") );改为QTextCodec::setCodecForTr( QTextCodec::codecForName("utf-8") );也不行。没办法了,查资料,然后看了源代码。折腾了2个小时终于搞清楚了。
原来Codecs是以plugin的形式被调用的,显示中文的codec plugin文件是qcncodecs4.dll。里面有QGb18030Codec、QGbkCodec和QGb2312Codec三个类。注意,后两个类是从第一个类派生的,因为它们的字符只是Gb18030的特定子集。GBK和GB2312只是为了兼容旧的系统和软件。大家以后可以直接使用GB18030。这个类真正的“肉”就是巨长的一个编码数组。(这里感谢turbolinux,gnuchina等一些前辈提供了这些编码,详见Qt中的说明)
既然找到了正主儿,那么问题也就迎刃而解了。将qcncodecs4.dll拷入目标机器的特定路径,如果你开发的电脑Qt安装目为C:\Qt的话,qcncodecs4.dll应该拷入目标电脑的C:\Qt\Plugins\Codecs。运行程序,看到了久违的汉字。
有没有更好的方法呢?在Qt(Cute)中当然有了:)
感谢Qt的plugin系统,将qcncodecs4.dll拷贝到运行程序目录下的特定目录,如运行程序完整路径为C:\MyApp\MyApp.exe,那么qcncodecs4.dll应拷贝至C:\MyApp\Plugins\Codecs下,然后在main函数中加入下面的代码:

QApplication a(argc, argv);

QString sPath = a.applicationDirPath();
sPath += QString("/plugins");
a.addLibraryPath(sPath);

这段代码将C:\MyApp\Plugins加至plugin的目录list中,制作软件安装程序时将qcncodecs4.dll文件与其它文件一起打包,安装时按ExePath\Plugins\Codecs目录安装即可。
至此,能想到的问题都搞清楚了,我可以睡觉了。

PS1:我使用的是最新的Qt 4.6版
PS2:Debug版本要使用qcncodecsd4.dll,跨平台的就是不一样,MS的大bug在这里不会再坑人了
PS3:Qt最新的Creater有很大的进步,大家可以试试


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ryanzz/archive/2010/03/04/5345251.aspx
在迷茫中追逐
快速回复
限100 字节
 
上一个 下一个