Qt中translate、tr关系 与中文问题
题外话:何时使用 tr ? 在论坛中漂,经常遇到有人遇到tr相关的问题。用tr的有两类人:
注意哦,如果你正在用tr包裹中文字符,却不属于(2b),那么,这是个信号:
如果你确实属于(2b),请做好心理准备,你可能还会遇到很多困难,请考虑Qt国际化(源码含中文时)的点滴分析 tr 是做什么的?下面二者的区别是什么? QString text1 = QObject::tr("hello");QString text2 = QString("hello"); tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文"你好"),那么text1的内容将是中文"你好";如果你为程序提供且使用日文翻译包,那么text1的内容将是日文。 tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。 关注的对象本文关注的是tr或translate中包含中文字符串的情况:
这个问题本多少可说的。因为涉及到的编码问题和QString 与中文问题中是完全一样的,只不过一个是用的setCodecForCStrings一个用的是setCodecForTr。 简单回顾QString的中文问题
例子: QString s1 = "我是中文"; QString s2("我是中文"); QString s3; s3 = "我是中文"
如果不指定编码,s1,s2,s3将全部都是(国内大多数人所称的)乱码。因为QString将这些const char *按照latin1来解释的,而不是用户期待的gbk或utf8。 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")) 这两条语句中的一条可以解决问题,至于如何选择,此处不再重复。 QObject::tr说实话,在tr中使用中文不是个好主意。不过既然总有人用(无论是(1)还是(2b)),而且总有人遇到问题,所以还是简单整理一下吧。 相比QCoreApplication::translate,大家用tr应该用的很多了,尽管不少人不清楚tr究竟是做什么的^_^ tr("我是中文"); 这调用的是下面这个函数(至少我们可这么认为是)。 QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。 如何告诉tr你写的这几个汉字在磁盘中保存的是何种编码呢?这正是 QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); 所做的。这两个选择的原则,由于和前文完全一样,此处也不再重复。 如果你的编码采用的utf8,可以直接使用trUtf8而不必设置setCodecForTr。 如果你只关心乱码问题,到此为止就可以了(下面不再关注编码)。如果想对tr进一步了解,不妨。。继续。。 QCoreApplication::translate我们知道tr是用于实现程序的国际化(或者说多语言翻译),看Qt相关资料的话,我们知道实现该功能的还有下面这个函数: QString QCoreApplication::translate ( const char * context, const char * sourceText, const char * disambiguation, Encoding encoding, int n ) 其实,这个才是真正进行翻译操作的函数,前面我们提到的tr最终是通过调用该函数来实现翻译功能的(稍后我们会看tr是如何调用translate的)。 对tr和这个函数,manual中都有比较详尽的解释。我们这儿简单看一下它的这几个参数:
tr与translate这两个函数的说明,一个在QObject的manual,另一个在QCoreApplication的manual中。 介绍一下tr与translate的关系。前面提到了,tr调用的是translate。如果仅仅这样一说,没有证据,还真难以让大家相信。好吧,继续 tr 在何处定义你可能说:这不废话吗,manual中写得明白的,它是QObject的静态成员函数。而且还有源码为证: //来自 src/corelib/kernel/qobject.h #ifdef qdoc static QString tr(const char *sourceText, const char *comment = 0, int n = -1); static QString trUtf8(const char *sourceText, const char *comment = 0, int n = -1); #endif 嘿嘿,差点就被骗了,发现没:它们被预处理语句包住了。 这说明了什么呢?说明了这段代码仅仅是用来生成Qt那漂亮的文档的(qdoc3从代码中抽取信息,生成一系列的html格式的manual)。 啊,也就是说,这是假的。那么真正的定义呢??在一个大家都很熟悉的地方,猜猜看? 这就是 Q_OBJECT 该宏的定义在src/corelib/kernel/qobjectdefs.h中 #define Q_OBJECT \public: \Q_OBJECT_CHECK \static const QMetaObject staticMetaObject; \ Q_OBJECT_GETSTATICMETAOBJECT \ virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \QT_TR_FUNCTIONS \virtual int qt_metacall(QMetaObject::Call, int, void **); \private: 其中的宏QT_TR_FUNCTIONS # define QT_TR_FUNCTIONS \ static inline QString tr(const char *s, const char *c = 0) \{ return staticMetaObject.tr(s, c); } \static inline QString trUtf8(const char *s, const char *c = 0) \{ return staticMetaObject.trUtf8(s, c); } \static inline QString tr(const char *s, const char *c, int n) \{ return staticMetaObject.tr(s, c, n); } \static inline QString trUtf8(const char *s, const char *c, int n) \ { return staticMetaObject.trUtf8(s, c, n); } 现在看到:tr调用的是 staticMetaObject对象的tr函数,staticMetaObject 的定义在moc生成的 xxx.moc 或 moc_xxx.cpp 文件内(你随时可以验证的)。 staticMetaObject 是一个 QMetaObject 类的实例,我们继续看一下该类的源码: /*!\internal */QString QMetaObject::tr(const char *s, const char *c) const{return QCoreApplication::translate(d.stringdata, s, c, QCoreApplication::CodecForTr); } /*! \internal */ QString QMetaObject::trUtf8(const char *s, const char *c) const { return QCoreApplication::translate(d.stringdata, s, c, QCoreApplication::UnicodeUTF8); } 至此,我们应该都看清楚了。我们的 Q_OBJECT 宏展开后为生成 tr ,tr调用QCoreApplication的translate函数。而该函数需要指定编码。 |
Qt中translate、tr关系 与中文问题相关推荐
- 关于qt中的tr( )函数
为什么80%的码农都做不了架构师?>>> 在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用 ...
- 关于qt中的tr()函数
在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...
- QT中的tr()函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 在Qt中使用字符串时,经常看到有人会使用QObject::tr(),其实很多人都在乱用tr()函数,那么今天就来教大家如何正确的 ...
- 解决QT中使用不了搜狗中文输入法的问题
环境:ubuntu15.04/QT5.6.0 背景:最近开发用到QT5.6.0,在ubuntu中输入汉字使用的搜狗输入法,但是在QT中无法切换到搜狗输入法,手动能切换,但是切换后仍然无法打出汉字,在其 ...
- Qt中tr()函数的使用
关于qt中的tr()函数 在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: 因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr 另一类人,确实是出于国际化的需要,将需要 ...
- C++ Qt学习笔记(3)QT中的文本处理
1. 富文本和纯文本的概念: 纯文本: 例如一个txt文件打开,里面只有文本内容,除此之外什么都没有,非常单调,这既是纯文本. 富文本: 例如一个.doc的word文件,打开之后,不但有文字,还有 ...
- QT中的TS文件与QM文件
一.介绍一下QM文件与TS文件与作用与联系. qm是qt的语言文件.用qt的languist先制作好ts文件,再生成qm文件,再在qt程序里面加载qm文件即可实现国际化 QM文件是QT中transla ...
- [转]QT中QString与string的转化,解决中文乱码问题
[转]QT中QString与string的转化,解决中文乱码问题 参考文章: (1)[转]QT中QString与string的转化,解决中文乱码问题 (2)https://www.cnblogs.co ...
- 解决Ubuntu18.04下Qt中无法输入中文的问题
问题描述:我的中文输入法是搜狗的,但在qt中写代码时一直无法切换成中文,重启无效! 原因:安装的qt中缺少中文输入环境 解决办法: 进入到/usr/lib/x86_64-linux-gnu/qt5/p ...
最新文章
- 第九章 Shell信号发送与捕捉
- 用GO把你想说的话写到比特币链上
- select可选择、同时可自行输入
- C 语言读写中文出现乱码
- Word保存自己格式模板的方法
- 如何自动填充网页表单_iCab for Mac(web网页浏览器)
- 图像处理工具包ImagXpress中如何设置上下文菜单
- C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
- 常用的Java快捷键有哪些
- oracle没有注册mdsdora,oracle rac一个节点服务注册不上,必须重启监听才能注册上,各位大神帮忙看一下...
- “科学学”视角下的科研工作者行为研究
- js 验证身份证号码
- Tomcat 指定jdk
- linux看注册的定时任务,Linux下定时任务的查看及取消
- ECharts数据可视化:入门、实战与进阶干货
- 个人税收计算器(只限长沙)全线仿照九米个税计算器
- mysql中+desc用法,数据库desc的用法有哪些用法
- c++判断整数翻转溢出_C++整数溢出
- 泥瓦匠聊并发编程基础篇:线程中断和终止
- 2023AB斗篷玩法全攻略
热门文章
- raid5 合适 多少块硬盘_raid1 raid2 raid5 raid6 raid10如何选择使用?各需要几块硬盘?...
- android页面布局更改,使用setContentView的方式更换布局文件从而更换界面
- java数组排序源码_Java 数组工具类排序,最大值最小值等
- Linux 总线、设备、驱动模型的探究
- HBase 2.0版本正式发布
- outofmemory异常如何解决?
- Up or out!!!
- AC自动机:多模式串匹配实现敏感词过滤
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第4篇] P类复杂问题
- [区块链与密码学][王小云院士][部分PPT][20200507]