- 浏览: 3449108 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
转载:http://hi.baidu.com/cyclone/blog/item/aa56e5dd1a79f7e176c638be.html
题外话:何时使用 tr ?
在论坛中漂,经常遇到有人遇到tr相关的问题。用tr的有两类人:
- (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr
- (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用tr包起来,这有分两种:
- (2a) 用tr包住英文(最最推荐的用法,源码英文,然后提供英文到其他语言的翻译包)
- (2b) 用tr包住中文(源码用中文,然后提供中文到其他语言的翻译包)
注意哦,如果你正在用tr包裹中文字符,却不属于(2b),那么,这是个信号:
- 你在误用tr
- 你需要的是QString,而不是tr
如果你确实属于(2b),请做好心理准备,你可能还会遇到很多困难,请考虑Qt国际化(源码含中文时)的点滴分析
tr 是做什么的?下面二者的区别是什么?
QString text1 = QObject::tr("hello"); QString text2 = QString("hello");
tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文"你好"),那么text1的内容将是中文"你好";如果你为程序提供且使用日文翻译包,那么text1的内容将是日文。
tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。
关注的对象
本文关注的是tr或translate中包含中文字符串的情况:
-
QObject::tr()
-
QCoreApplication::translate()
-
QTextCodec::setCodecForTr
这个问题本多少可说的。因为涉及到的编码问题和QString 与中文问题中是完全一样的,只不过一个是用的setCodecForCStrings一个用的是setCodecForTr。
简单回顾QString的中文问题
- QString 采用的unicode,在中文支持上不存在任何问题
-
"我是中文" 这是传统的 const char * 的窄字符串
- 当将窄字符串赋值到QString时,我们需要告诉它我们的窄串采用的何种编码(gbk?、utf-8?)
- 究竟何种编码主要取决于我们的源代码文件的编码(windows上一般是gbk,其他平台一般utf-8)
例子:
QString s1 = "我是中文"; QString s2("我是中文"); QString s3; s3 = "我是中文"
-
s1、s2 用的是QString的构造函数QString ( const char * str )
-
s3 用的是QString的赋值操作符 QString & operator= ( const char * str)
如果不指定编码,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究竟是做什么的^_^
这调用的是下面这个函数(至少我们可这么认为是)。 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。 如何告诉tr你写的这几个汉字在磁盘中保存的是何种编码呢?这正是 所做的。这两个选择的原则,由于和前文完全一样,此处也不再重复。 如果你的编码采用的utf8,可以直接使用trUtf8而不必设置setCodecForTr。 如果你只关心乱码问题,到此为止就可以了(下面不再关注编码)。如果想对tr进一步了解,不妨。。继续。。 我们知道tr是用于实现程序的国际化(或者说多语言翻译),看Qt相关资料的话,我们知道实现该功能的还有下面这个函数: 其实,这个才是真正进行翻译操作的函数,前面我们提到的tr最终是通过调用该函数来实现翻译功能的(稍后我们会看tr是如何调用translate的)。 对tr和这个函数,manual中都有比较详尽的解释。我们这儿简单看一下它的这几个参数: CodecForTr 使用setCodecForTr()设置的编码来解释 sourceText 这两个函数的说明,一个在QObject的manual,另一个在QCoreApplication的manual中。 介绍一下tr与translate的关系。前面提到了,tr调用的是translate。如果仅仅这样一说,没有证据,还真难以让大家相信。好吧,继续 你可能说:这不废话吗,manual中写得明白的,它是QObject的静态成员函数。而且还有源码为证: 嘿嘿,差点就被骗了,发现没:它们被预处理语句包住了。 这说明了什么呢?说明了这段代码仅仅是用来生成Qt那漂亮的文档的(qdoc3从代码中抽取信息,生成一系列的html格式的manual)。 啊,也就是说,这是假的。那么真正的定义呢??在一个大家都很熟悉的地方,猜猜看? 这就是 该宏的定义在src/corelib/kernel/qobjectdefs.h中 其中的宏QT_TR_FUNCTIONS 现在看到:tr调用的是 staticMetaObject对象的tr函数,staticMetaObject 的定义在moc生成的 xxx.moc 或 moc_xxx.cpp 文件内(你随时可以验证的)。 staticMetaObject 是一个 QMetaObject 类的实例,我们继续看一下该类的源码: 至此,我们应该都看清楚了。我们的 Q_OBJECT 宏展开后为生成 tr ,tr调用QCoreApplication的translate函数。而该函数需要指定编码。tr("我是中文");
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QCoreApplication::translate
QString QCoreApplication::translate ( const char * context, const char * sourceText, const char * disambiguation, Encoding encoding, int n )
tr与translate
tr 在何处定义
//来自 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
Q_OBJECT
#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:
# 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); }
/*!
\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);
}
发表评论
-
更换博客地址告示
2012-12-03 18:56 2600更换博客地址告示 ... -
收款主页设计
2012-11-17 11:01 0文档信息 版权声明:自由转载-非商用-非衍生- ... -
10个精选国外免费空间
2012-11-12 16:06 6335最近想申请一个免费空间,发现国内基本没有。。。。唉。 ... -
长光所考博信息
2012-09-24 14:25 2706总结一下,以后有个奔头。。搞科研的收入太微薄了。唉。。。 ... -
The file contains a character that cannot be represented in the current code pag
2012-08-17 10:17 6333vs2008 打开网上下载的Qt项目,结果编译时无法通过,出 ... -
64位操作系统,编译程序出现X86和X64的冲突
2012-08-16 20:10 0问题1:1>QtGuid4.lib(QtGuid4.d ... -
通用日志系统开发【转】
2012-08-06 15:20 42441.前言 中大型软件项 ... -
U盘制作WinPE系统【转】
2012-07-27 11:36 2527不带光驱的笔记本的网友和没有光驱的台式机的网友如何安 ... -
博客文章标题横线框
2012-06-28 11:47 0分析 ... -
触摸屏介绍
2012-05-30 16:03 1985有一个项目,需要购买一台触摸屏设备。 了解一下触摸屏的基础知 ... -
有谁知道高速大数据量无线传输技术
2012-05-28 11:53 2523有谁知道高速大数据量无线传输技术? 想了解一下无线传输 ... -
自由在博客里插入广告,有钱你不赚吗???
2012-05-25 18:37 01、一直在ITeye里写技 ... -
自由在博客里插入广告,有钱你不赚吗???
2012-05-25 15:22 6638其实这些广告也没啥意 ... -
支持javascript的博客汇总
2012-05-25 09:27 2490写这篇文章的目的主要是为想在公共博客上布置广告的朋友提供一些参 ... -
支持js代码的博客有哪些?
2012-05-25 09:20 33031、支持js代码的博客谷歌博客, 雅虎奇摩,博客大巴,jimd ... -
VS2008无法下断点调试的原因
2012-05-02 11:18 19330VS2008单步调试时出错,原来的断点处显示一个空心圆加 ... -
VS2008无法下断点调试的若干解决办法
2012-05-02 09:19 4043我使用了第一种方法,暂时恢复了断点调试。 调试程 ... -
【转】串口通讯—通信协议
2012-02-29 00:11 2643转:http://cs.nju.edu.cn/y ... -
Ankhsvn 改名出错
2012-02-16 18:32 3175总结只改变文件名字大小写的最终解决方法。 这种只需要改 ... -
C++接口实现总结
2012-02-04 14:51 32929网上的例子,稍微有点错误。我给更改一下,附件上有源码!如有错误 ...
相关推荐
Qt 中 translate、tr 关系以及中文乱码的问题 在 Qt 应用程序中,translate 和 tr 是两个常用的国际化方法,但是它们之间的关系和中文乱码的问题却经常引起混淆。在本文中,我们将详细讨论 translate 和 tr 的关系...
这通常通过Qt Linguist工具完成,该工具允许开发者导入源代码中的字符串(使用`tr()`函数标记),然后进行翻译。 以下是实现Qt中英文切换的基本步骤: 1. **创建翻译文件**:使用Qt Linguist打开项目源代码,选择...
- **字符串标记**: 对于一些不能直接使用`QObject::tr()`处理的字符串,Qt提供了`QT_TR_NOOP()`和`QT_TRANSLATE_NOOP()`来标记它们,以便后续的提取和翻译。 #### 五、文本提取与翻译 - **提取**: Qt提供了一个名...
此步骤是将工程中的文字(加tr等包含的文字)进行提取到ts文件中 接下来,在终端运行 x@x:~$ linguist 打开 Qt Linguist 翻译工具,对文字进行逐个翻译并保存 在工程中再执行: Tools -> External -> ...
3. 如何使用QT_TR_NOOP, QT_TRANSLATE_NOOP 4. QObject::tr() 是如何工作的. 5. lupdate 工具是如何工作的. 6. 如何提取宏定义中的字符串? 也就是说宏定义中字符串如何支持国际化? 7. 类中字符串如何支持国际化. 8....
本教程将深入探讨如何在QML中实现国际化,特别是中文与英文之间的转换。 首先,理解Qt的国际化机制。Qt使用`.qm`文件来存储翻译,这是一种二进制格式,由`lupdate`工具从源代码中提取字符串,然后使用`lrelease`...
总结,Qt国际化多页面的关键在于正确地创建、管理翻译文件,并在代码中适当地使用translate()函数。在Qt Creator中,这个过程可以高效且直观地进行。通过以上步骤,你可以创建一个能够适应全球不同语言用户的多页面...
6. **多语言切换**:在应用中,可以通过`QApplication::installTranslator()`方法安装翻译器,然后使用`QApplication::removeTranslator()`和`QApplication::translate()`方法来动态地加载和卸载不同语言的翻译器,...
可以使用Qt的资源系统(.qrc文件)将资源打包进应用,然后通过`QObject::tr()`或`QApplication::translate()`进行国际化处理。 8. **样式表(QSS)** Qt支持使用CSS样式的QSS(Qt Style Sheets)来定制界面外观,...
在Arrowpad项目中,开发者首先运行lupdate命令,扫描源代码中的`tr()`或`QSTr()`函数,将这些需要翻译的字符串抽取出来,生成一个`.ts`(Translation Source)文件。这个文件包含了所有待翻译的文本及其上下文信息。...
Qt提供了丰富的API来处理这些任务,例如`installTranslator()`和`removeTranslator()`函数,用于安装和卸载翻译器,以及`translate()`函数,用于在代码中动态查找和使用翻译。 CMake是一种跨平台的构建系统,常用于...
例如,当你在UI部件(如按钮、标签等)的文本或任何其他需要显示给用户的消息中使用`tr()`,Qt的Linguist工具就能识别这些字符串并提供翻译。基本用法如下: ```cpp void MyClass::someFunction() { QString ...
这里值得注意的是`Q_OBJECT`宏的存在,这是为了让Qt的元对象系统(Meta-Object System)能够识别并处理该类中的信号和槽(Signals and Slots)。此外,`paintEvent`函数是Qt提供的一种机制,用于重绘窗口或部件时...
uic工具的主要用途是从Qt Designer创建的用户界面文件(.ui文件)中读取数据,并生成相应的Python代码文件。 - **命令行使用方式**: ``` uic [options] ``` 其中`[options]`包括但不限于: - `-o <file>`...
3. **在代码中使用资源**:在Objective-C++代码中,通过`QObject::tr()`或`QApplication::translate()`函数来加载翻译资源,而对于非文本资源,如图片,可以使用`QPixmap`, `QImage`或`QFile`等类的静态方法,如`...