先给出一个我当前项目的配置文件,再一一解释:
myproject.pro
TEMPLATE = app
QT += core gui sql
CONFIG += debug MODULE_GUARD_DOG
DEFINES += MODULE_GUARD_DOG
TARGET = wms
DESTDIR = ./bin
DLLDESTDIR = ./bin
中文翻译英文转换器DEPENDPATH += .
INCLUDEPATH += ./tmp ./include ./modules/usbphone
INCLUDEPATH *= .
LIBS += -Llib -lGxUsb
MOC_DIR = ./tmp
OBJECTS_DIR = ./tmp
UI_HEADERS_DIR = ./tmp
RCC_DIR = ./tmp
include(wms.pri)
include(modules/usbphone/usbphone.pri)
win32:RC_FILE =
MODULE_GUARD_DOG{
HEADERS += GuardDog.h
SOURCES += GuardDog.cpp
}
C++的工程往往有两大类,一是应用程序,另一个则是动态(静态)库。TEMPLATE参数差不多就是标识这个工程的类型了。它有app、lib、subdirs三种类型。前两种类型与两类工程相关,subdirs则是用于配置子项目的。当一个工程比较复杂时,可能会将其分为多个项目,项目之间又相关关联,此时可以写一个统领全局编译配置的文档,其模板类型就是subdirs,意思是说,当前的这个文件呢,只负责协调子项目之间的编译,不包含具体的编译事宜。子项目下面也会有.pro文件,并且要负责其项目中的源文件编译。subdirs类型在Qt的源码中用的比较广泛,毕竟是大工程。呵呵。
QT参数表示当前项目中使用到了哪些QT的模块。core表示核心模块,这是整个QT框架的基础,所有的QT项目都会默认包含这个模块。 gui是图形用户界面模块,这个也是默认包含的项目中的,毕竟GUI是QT的强项吧。sql是数据库模块。当前的项目中只使用到了这三个模块,另外,QT 还有netword、opengl(3D图形库)、phonon(多媒体库)、svg、xml、webkit(浏览器引擎)等模块。
CONFIG参数用于指定当前项目配置及项目被编译时的一些选项——如项目是以debug还是release模式的编译。其常规值有 debug、release、debug_and_release、build_all、ordered、warn_on、warn_off。 CONFIG可以是一个或者多个这样的值,也就是说用户可以设置:
CONFIG += debug release #注意,不同的值是用空格隔开的
release: 是不调试程序,直接编译和连接库文件; 不会生成另一个目录等调试信息
debug: 编译和连接QT库时调试;
同时给它赋予debug和release值可不是相像是的那样让项目同时在两种模式下编译哦,debug参数会覆盖release值的,也就是说,在这样的配置下,项目还是只会在debug模式下编译,除非使用了debug_and_release值。另外,build_all与 debug_and_release差不多是一样的,warn_on、warn_off是开启或者关闭编译警告。剩下要说的是ordered,它的意思是按顺序编译。这个值要与TEMPLATE中的subdirs值配合使用,意思按.pro文件中的目录顺序编译。
说完了CONFIG的常规值,再来说说不常规的值——常规以外的,都是不常规的啦。用户其
实可以给CONFIG赋予任意合法字符窜的。如上面配置文件中就有一个MODULE_GUARD_DOG(加密狗模块),当然,这个模块并非QT所有,而是我自己项目中的模块。MODULE_GUARD_DOG 除了出现在CONFIG中以外,还在DEFINEDS和文件最后面出现过。CONFIG中的MODULE_GUARD_DOG与DEFINEDS中的 MODULE_GUARD_DOG其实没有什么关联,若要说有,那也只是它们刚好服务于同一个模块而言。但是CONFIG中的 MODULE_GUARD_DOG却让qmake执行了文件最后面大括号中的内容。
在qmake配置文件有条件判断语句,类似于
if(xxx){}
之类了。不过,不需要if。那么 MODULE_GUARD_DOG{} 语句的意思就是当文件中定义了MODULE_GUARD_DOG的时候,就执行括号中的内容(把头文件和源文件编入到编译范围中)。类似的判断还有很多,qmake提供一些判断函数,如isEmpty()、contains()等,详细的请参数qmake操作手册。
DEFINES参数:其作用嘛,就是
#ifndef XXX
#define XXX
#endif
明白了吧,它也就是一个define,我们也经常在命令行中使用的-DXXX一样。
TARGET参数:项目生成的exe文件,或者.dll、.lib、.a等文件的文件名。默认是项目工程目录的名字。DESTDIR、DLLDESTDIR则是exe,lib,dll这些文件所有的目录了。
INCLUDEPATH参数:项目所需要头文件的路径
LIBS参数:项目所使用到的静态文件的路径。其中-L表示静态文件的路径、-l表示静态文件的名字(不包含扩展名)。也可以不用-L -l,直接写完整路径,如LIBS += C:/A.LIB(注意,现在可是需要扩展名的啦)
MOC_DIR、OBJECTS_DIR、UI_HEADERS_DIR、RCC_DIR指的是编译过程中产生的名种重要临时文件的目录。 MOC_DIR是元对象编译的中间结果,由moc命令产生,OBJECTS_DIR是编译器产生,.obj文件,经过链接之后就生成那个exe啦。 UI_HEADERS_DIR图形文件对应的头文件,由uic产生。RCC_DIR是资料文件被编译后产生的结果。这些文件都是临时,生成的exe文件并不需要使用到它们,因此把它们放在临时目录即可。一般IDE工具会把它们默认放在debug目录中,但有时候也会与自己的源文件混在一起。所以最好还是给它们指定一个目录。
include表示包含一个pri的配置文件。pri配置文件与pro文件格式几乎相同,就像ant的配置文件有时也会引入其它的配置文件一样。主要是用于把公共的,或者需要独立的配置部分抽出来。因为一个项目里面可能存在多个pro文件,而这几个pro文件又可以同时使用到一些相同的内容。另外,pri文件在一定程序上也可以用于划分包逻辑结构。c++没有像java那样的包层次结构,但用这种方式在一定程度上达到相似的效果。
RC_FILE参数:指定的是项目资源文件。这个文件会被编译到exe文件中,它里面可以包含图片、文档等。(在
creator中,此文件名为 RESOURCES)一般用于不想被用户修改的只读数据了。如项目中使用的一些图片、系统初始化用于配置之类。让人疑惑的是,前面为什么有一个win23:呢?与前面提到的MODULE_GUARD_DOG{} 一样,这是一种缩写形式。如果当前的平台是win32的,就执行冒号后面的语句(只能有一条,如果多条的话,就要用括号了)。平台参数与当前的开发环境相关,还有unix、mac、wince等参数。
TRANSLATIONS: 用于 tr() 中相关字符串的替换,程序运行时会在 .ts文件中查与 tr() 中内容匹配的字符串代替,常用于汉字显示。
.ts 格式如下:
<!DOCTYPE TS><TS>
<context>
<name>MessageBox</name>
<message>
<source>Message Box Example</source>
<translation>QMessageBox娑堟伅妗嗗疄渚?/translation>
</message>
<message>
<source>It's end of document,search from begin?</source>
<translation>宸插埌杈炬枃妗g粨灏?鏄惁浠庡ご鎼滅储?</translation>
</message>
<message>
<source>anything you want tell user</source>
<translation>濉啓浠绘剰鎯冲憡璇変簬鐢ㄦ埛鐨勪俊鎭?/translation>
</message>
<message>
<source>Save changes to document?</source>
<translation>鏄惁淇濆瓨瀵规枃妗g殑淇敼?</translation>
</message>
<message>
<source>tell user a critical error</source>
<translation>鎻愰啋鐢ㄦ埛涓€涓嚧鍛界殑閿欒</translation>
</message>
<message>
<source>Message box example!</source>
<translation>QMessageBox瀹炰緥!</translation>
</message>
<message>
<source>Lock</source>
<translation>閿佸畾</translation>
</message>
<message>
<source>Unlock</source>
<translation>瑙i攣</translation>
</message>
<message>
<source>This is a custom message box</source>
<translation>杩欐槸涓€涓嚜瀹氫箟鐨勬秷鎭
鏍囬 鍥炬爣 鎸夐挳 鏂囧瓧閮藉彲鑷畾涔?/translation>
</message>
</context>
</TS>
1)在design.pro文件里面加入TRANSLATIONS = design.ts。
(2)用lupdate 操作pro,以提取出.ts文件供下面的lingusit工具翻译成所需要的.qm文件。命令是#lupdate design.pro。*.ts文件是翻译源文件,它是基于XML语言描述的。通过编辑*.ts文件,已经指定了对应的翻译信息。这一步是翻译的过程,所谓翻译就是把tr("english")中的english 提取出来,以翻译成相应的语言,供程序加载使用。
(3)用linguist打开刚才的design.ts文件,linguist是在qt的bin的目录下的一个界面工具。如果使用QT/E 2.3.7的版本,没有自带这一个工具,可以在windows下单独下载linguist工具进行这一步。在linguist中用菜单栏file ->o
pen 打开相应的.ts文件,如该设计中的design.ts。打开后会看到左边是相应的类,右边的上半部是相应的类里面提取出来供翻译的内容,下半部是要翻译的语言的相应的东西,即为需要输入中文的地方。在翻译中,要注意标点符号的翻译最好还是用英文输入状态下的标点符号。当翻译状态前出现绿勾的提示为翻译成功,叹号的表示没有翻译对,交叉的表示没有翻译。
(4)先用linguist 菜单保存翻译好的.ts文件, 接着用linguist界面工具里面菜单file里面的,点击这个弹出对话框,提示输入.qm文件的文件名,用默认的即可。按确定后你会在.ts文件所在的目录看到一个.qm后缀名的文件,这就是程序翻译器要用到的文件。
(5)最后,把design.qm文件copy到design目录下, 在main.cpp程序里面使用刚才得到的.qm文件 ,方法如下:
QTranslator translator( 0 ); //生成翻译器
translator.load( "design.qm", "." ); //载入qm文件,与刚才得到的qm的文件名对应
app.installTranslator( &translator ); //安装翻译器
MyWidget m;
m.setFont(QFont("unifont", 16)); //设置中文字体 
app.setMainWidget( &m ); // 将m设为当前窗口 
m.show(); //将当前窗口显示出来
程序在运行时是动态提取和源语言对应的本地语言信息并显示在用户界面上。设计中一定要在界面出来之前安装翻译器,否则就不能在界面中显示翻译后的界面。
另外的方法:
使用 QTextCodec 类:
在使用编码转换器时,有以下几种方式:
1. 在程序开始位置设置QObject的成员函数tr()的编码器,后面程序中都可以用tr()直接转换字符串;
QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //或者codecForName("GBK")
… ….
QString str(tr(“本地文本”));
2. 用QTextCodec的toUnicode方法来显示中文
QTextCodec *codec = QTextCodec::codecForLocale();
QString a = codec->toUnicode("本地文本");
3. 使用QString的fromLocal8Bit()函数族;
QString str = str.fromLocal8Bit("哈哈哈");
通过比较,方法1对于界面文本处理是比较好的,可以一次设置,全局使用。而且tr函数可以用于国际化,在把软件转换为其他语言版本或者多语言版本时,只需通过qm文件就可以,非常方便。
方法2使用非常灵活,适合于程序中处理特定编码字符串的时候使用. 例如读取文件内容。
方法3只是为了方便QString类使用,而对QTextCodec类的toUnicode()函数进行的一些封装。效率上肯定要差一些。例如:fromLocal8Bit()就是利用了codeForLocale()解码器。
To read or write files in various encodings, use QTextStream and its setCodec() function. See the Codecs example for an application of QTextCodec to file I/O.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。