Archive for December, 2016

QT中.pro文件写法概述

December 15th, 2016

最近在实现一个自动化编译qt工程的pro生成器,pro文件是组织qt项目的核心。

如果我们开始没有使用pro文件组织项目的话,可以先使用qmake -project生成一份pro文件,然后再着手对其进行修改。下面是我使用命令生成的一个pro文件:

######################################################################
# Automatically generated by qmake (2.01a) ?? 1? 5 19:54:06 2017
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += . include . src
INCLUDEPATH += .

# Input
HEADERS += include/ISCAS.h include/ISCASDef.h
SOURCES += src/ISCAS.cpp

TEMPLATE 参数指的是要编译出来什么东西,是独立运行的app还是dll文件或者是其他,
TEMPLATE = app

A> app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
B> lib – 建立一个库的makefile。
C> vcapp – 建立一个应用程序的VisualStudio项目文件。
D> vclib – 建立一个库的VisualStudio项目文件。
E> subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。

TARGET 指定生成的应用程序名,有时候我们将pro文件转换成为vcxproj文件(qmake -r -tp vc),我们想同时指定编译文件名字,比如release版本不带后缀d,而debug版本带d,程序员只需要切换编译模式就可以生成不同名字的文件。

TARGET = ProjectName
TARGET = $$qtLibraryTarget($$TARGET)

DEPENDPATH 指定程序编译时依赖的相关路径 DEPENDPATH += . forms include qrc sources

INCLUDEPATH 指的是头文件包含路径 INCLUDEPATH += .

后面的 HEADERS 和 SOURCES 就是指定 编译的头文件和源代码

下面来看另外一个pro文件模板:

PLATFORM_VERSION =  x86_32
ALLONE_DIR = E://

QT +=  xml quick sql xml network script webkit xmlpatterns testlib declarative

TEMPLATE = lib
TARGET = ISCAS
DEPENDPATH += .
INCLUDEPATH += ./include $$ALLONE_DIR/include
DEFINES += ISCAS_LIB
OBJECTS_DIR = ./tmp/obj
MOC_DIR = ./tmp/moc
DESTDIR = $$ALLONE_DIR/lib/component
CONFIG += qt warn_on debug_and_release console

# Input
HEADERS +=	./include/ISCAS.h	\
				./include/ISCASDef.h
SOURCES +=	./src/ISCAS.cpp

FORMS	+= ./forms/CSSC.ui
RCC_DIR = forms
UI_DIR = ./tmp
TRANSLATIONS = CSSC.ts
win32{
	CONFIG(release,release|debug){
	    LIBS += $$ALLONE_DIR/lib/win32/ComponentBase.lib
	    
	    LIBS += $$ALLONE_DIR/lib/win32/AllOneFoundation.lib
        
	    LIBS += $$ALLONE_DIR/lib/win32/EventNotification.lib
        
	    LIBS += $$ALLONE_DIR/lib/win32/DDSMsgHandle.lib
	}

	CONFIG(debug,release|debug) {
	    LIBS += $$ALLONE_DIR/lib/win32/ComponentBased.lib
	    
	    LIBS += $$ALLONE_DIR/lib/win32/AllOneFoundationd.lib
        
	    LIBS += $$ALLONE_DIR/lib/win32/EventNotificationd.lib
        
	    LIBS += $$ALLONE_DIR/lib/win32/DDSMsgHandled.lib  
	}
}

PLATFORM_VERSION 表示编译的程序版本是32位还是64位。

这个模板里ALLONE_DIR是一个变量,我们可以在下面的位置通过$$ALLONE_DIR使用该变量。

QT 就是Qt的各个lib库。

DEFINES += XX_XX_XXX //定义编译选项,在.h文件中就可以使用 :#ifdef xx_xx_xxx,例如:

#if defined ISCAS_LIB
#  define ISCAS_EXPORT Q_DECL_EXPORT
#else
#  define ISCAS_EXPORT Q_DECL_IMPORT
#endif

Q_DECL_EXPORT宏主要为了导出这个类,生成.dll的同时生成.lib文件。提供给外部接口供其他类使用。

OBJECTS_DIR 为存放中间文件的目录,一般我们在编译我们的工程的时候会生成许多的中间文件,如.o文件(linux下)或.obj(windows下),这样我们的工程就很乱,所以我们可以定义这个选择。

MOC_DIR指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录。

DESTDIR指定生成的应用程序放置的目录。

CONFIG用来指定qmake关于应用程序的配置信息,在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。

A> qt部分告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。
B> warn_on部分告诉qmake要把编译器设置为输出警告信息的。
C> debug_and_release 部分告诉qmake应用程序生成debug版和release版的程序。
D> console指定该程序需要写控制台,包括cout cerr 等。

20170105220525

CONFIG(release,release|debug) 指定括号里里的LIBS+=是针对release版的,CONFIG(debug,release|debug)是针对 debug版的。

LIBS: 这里可以选择我们要包含的库,例如我们的工程要用到libz.so的一个压缩库,(如果是在Linux下,则去掉lib和后缀名,windows下去掉后缀名即可)在linux下我可以这样写:
LIBS += -lz  windows 下的libz.dll 为 LIBS += -llibz
或是用到image目录下的libimage.so库,那么可以这么写:
LIBS += -L../image/image

RESOURCES 定义工程资源描述文件,工程里需要很多图片,那么这些图片的定义都可以放在backup.qrc文件中进行描述,那么这里就可以指出我们的qrc文件。RESOURCES += backup.qrc

FORMS 指定工程中包含的.ui设计文件

UI_DIR 指定uic命令将.ui文件转化成ui_*.h文件的存放的目录,比如下面是存放到forms目录
UI_DIR += forms

RCC_DIR 指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录
RCC_DIR += ../tmp

TRANSLATIONS = CSSC.ts 就是使用lupdate -verbose CSSC.pro 生成ts文件。然后使用Qt linguist 翻译完毕以后,再使用lrelease -verbose CSSC.pro生成 .qm文件。

 

参考:

【1】http://blog.csdn.net/fjb2080/article/details/4833666

【2】http://blog.csdn.net/adriano119/article/details/5878169

【3】http://www.ithao123.cn/content-4528049.html

Qt 国际化

December 4th, 2016

Qt中的国际化的方法有很多,常用的有使用QTextCodec类和使用tr()函数。前者将编码名称写到代码里面,除非你使用Unicode编码,否则国际化依然是一个问题;后者就不会有这个问题,并且这也是Qt推荐的做法。因此,我们主要来说使用tr()函数的方法进行应用程序的国际化。

首先,我们需要在pro文件中增加一行: TRANSLATIONS += myapp.ts

myapp.ts是我们需要创建的翻译文件。这个文件的名字是任意的,不过后缀名需要是ts。然后我们打开命令提示符,进入到工程所在目录,比如我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件所在的文件夹,然后输入命令

lupdate -verbose MyApp.pro

如果出现的是命令不存在,请注意将Qt的bin目录添加到环境变量中(PATH第一个位置)。此时,如果更新的数目,说明ts文件创建成功。Qt提供了一个工具,Qt Linguist,你可以在开始菜单的Qt项下面的Tools中找到。用它可以打开我们的ts文件,然后进行我们的翻译工作,翻译工作完毕后使用

lrelease -verbose MyApp.pro

之后会生成MyApp.qm文件,该文件是二进制的形式,可以被Qt直接使用。下面我们要修改main()函数,使之加载这个qm文件:

int main(int argc,char *argv[]){
   QApplication a(argc, argv);
   QTranslator qtTranslator;
   qtTranslator.load("myapp.qm");
   a.installTranslator(&qtTranslator);
   MainWindow w;
   w.resize(800, 600);
   w.show();
   return a.exec();
}

这个界面已经加载该qm文件,qm文件其实是动态加载到exe文件中的,而不是直接编译进去的。

参考:

http://www.cnblogs.com/oloroso/p/4596740.html