Qt中使用中文的方法
acmilan2016/05/28软件综合 IP:四川
首先,不要使用tr,tr是编写国际化程序才需要的。tr包裹住的是英文,可提供翻译包翻译成中文,大多数情况来说是不必要的。
其次,不要使用QTextCodec::setCodecForXXX,这个在Qt5已经被废除了,在Qt4中如果设置为"GBK",对Win98也不起作用,最好是设置成"UTF-8"。

正确的做法是使用QString::fromWCharArray。为了方便起见,可以定义一个宏:
#define _Q(x) QString::fromWCharArray(L##x)
这个宏在Win98、WinNT和Linux中都能够正常工作,不会乱码。

示例代码如下:
<code class="lang-cpp">#include <qapplication>
#include <qfont>
#include <qpushbutton>
#include <qtcore qtextcodec>
#include <string.h>
   
#define _Q(x) QString::fromWCharArray(L##x)
   
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
   
    QWidget window;
    window.resize(200, 120);
   
    QPushButton quit(_Q("我是中文"), &window);
    quit.setFont(QFont("SimSun", 18, QFont::Bold));
    quit.setGeometry(10, 40, 180, 40);
    QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
   
    window.show();
    return app.exec();
}</string.h></qtcore></qpushbutton></qfont></qapplication></code>

[修改于 8年7个月前 - 2016/05/28 12:47:11]

来自:计算机科学 / 软件综合
7
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan 作者
8年7个月前 修改于 8年7个月前 IP:四川
820200
编写中文软件,使用_Q(x)宏就行了,如果需要编写国际化软件,再使用tr(x)宏。。。
这样的话,在Win98/WinNT中执行时只会进行字符串拷贝,而在Linux执行时会进行一次UTF-32到UTF-16的转换(因为Linux中的wchar_t是UTF-32)。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年7个月前 IP:四川
820205
如果需要调用WinAPI的话,建议另外建立一个适当编码的*.cpp文件来调用WinAPI。。。
1.windows.h会和Qt的头文件冲突
2.MinGW解析wchar_t字符串常量要求源代码是UTF-8,而这样的话会导致char字符串常量乱码
如果需要调用宽字符版本WinAPI,使用UTF-8编码保存源码
如果需要调用ANSI版本的WinAPI,使用GBK编码保存源码
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
.........
8年7个月前 IP:浙江
820207
我都是用tr或者QString
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年7个月前 IP:四川
820208
引用 .........:
我都是用tr或者QString
Qt4一个很坑的地方就是英语中心主义,char字符串就是设计为仅兼容英语Latin1的。。。
这个问题在Qt5中改掉了,Qt5中编码默认就给你设好了,所以直接用就可以了。。。
Qt5默认和系统区域相同,比如Windows下是GBK,Linux下是UTF-8。。。
Qt5中也没必要关心Win98的问题,因为本来就不支持了。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年7个月前 IP:四川
820209
嗯。。。如果要在Qt4中同时实现翻译和中文显示,可以这样定义_Q(x):
#define _Q(x) trUtf8(QString::fromWCharArray(L##x).toUtf8().data())
虽然麻烦了点,但是这是可移植性最好的做法。。。(注意要加上BOM)
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年7个月前 IP:四川
820485
如果需要同时调用ANSI和Unicode宽字符版本的WinAPI的话,也可以使用-finput-charset=GBK参数实现
但是仍然需要在单独的文件中调用,不然windows.h和Qt的头文件会冲突
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
我说要有光
8年7个月前 IP:河北
820574
其实正确的姿势应该是先编写英文版本,然后进行国际化
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年10个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}