KS02-02 整理一下目录吧
作者:互联网
引言
----------------------------------------------------------------------------------------------------------------------
前几天,在使用Qt编程时,为项目增加了几个ui文件。偶然看一下源代码目录,发现源代码目录下的临时文件和临时目录太多了,简直杂乱不堪,虽然我们的代码是通过svn管理的,提交时有过滤设置,这些临时文件不会被入库,但是有时候需要备份一下源代码目录并打包,如果带着这么多临时文件(文件尺寸还是非常大的),那可太不方便了。所以今天我们就讲一下该如何通过pro文件的配置来整理源代码目录。
正文
----------------------------------------------------------------------------------------------------------------------
先不忙,我们顺便讲一下为项目添加界面(ui)的方法。大概分为四步:
1, 使用designer绘制ui文件并保存。
2, 编写ui的派生类。
3, 将相关文件添加到pro。
4, 使用派生类
我们分步骤讲解。
第一步,使用designer绘制某对话框资源文件(.ui),请注意,对话框类名:CDialogBase,ui文件名:dialogbase.ui。
这两个名称请仔细记下,因为后面会用到。
第二步,我们编写ui的派生类:
代码清单:
- #ifndef DIALOG_H
- #define DIALOG_H
- #include "ui_dialogbase.h" // 头文件名称来自: dialogbase.ui ---> ui_dialogbase.h
- // 第一个父类的名称来自ui文件中对话框的类名:对象查看器中的类名
- // 第二个父类的名称来自ui文件中对话框基类的名称(objeceName属性): CDialogBase
- class CDialog : public QDialog, public Ui::CDialogBase
- {
- public:
- CDialog(QWidget* pParent);
- ~CDialog();
- };
- #endif
请注意上文中,#include "ui_dialogbase.h"。
该头文件就用到了我们刚才保存界面文件时的文件名” dialogbase.ui”,Qt的uic命令将该ui文件转换为ui头文件:“ui_dialogbase.h”,即 “ui_” 加上”dialogbase”共同拼接成了”ui_dialogbase.h”。
在class CDialog的定义处,我们编写了多重派生,第一个基类是Qt的QDialog,因为我们在designer中绘制时就是用的QDialog,第二个类看着是否有些面熟?答对了,我们刚才要求大家记住的类名称就是CDialogBase,而Qt在使用uic命令转换时会为对话框自动生成一个命名空间Ui,这个基类CDialogBase就在该命名空间内部定义,所以,我们第二个基类是:Ui::CDialogBase。
另外,请大家一定要注意,把Qt的基类写在前面,原因是:如果我们的CDialog需要使用Q_OBJECT宏,该宏展开时会用到Qt的基类(QObject)的一些接口,而编译器认为这些接口只能从第一个基类中查找。所以,请把Qt的基类写在前面。
下面给出CDialog的实现文件:dialog.cpp:
代码清单:
- /*! \file: dialog.h
- \brief 示例实现文件
- \author 星点课堂:女儿叫老白
- \Date 2018/9
- */
- #include "dialog.h"
- CDialog::CDialog(QWidget* pParent) : QDialog(pParent)
- {
- setupUi(this);
- }
- CDialog::~CDialog()
- {
- }
dialog.cpp比较简单,我们不做过多讨论,唯一需要注意的一点就是在构造函数中一定要调用setupUi(this);否则界面无法正常显示。
第三步,将相关文件添加到pro。我们目前添加了一个界面文件(dialogbaes.ui),添加了CDialog类的定义(.h)和实现文件(.cpp)。那么我们把他们添加到pro:
代码清单:
- QT += widgets
- FORMS += dialogbase.ui
- HEADERS += ks02_02.pro \
- dialog.h
- SOURCES += main.cpp \
- dialog.cpp
上述代码中,FORMS配置项用来描述项目中用到的ui文件,HEADERS和SOURCES两个配置项在前面章节介绍过。如果要使用界面,请确保QT+=widgets正确配置。
第四步,我们在代码中使用CDialog。我们需要先包含CDialog的头文件(dialog.h),然后在代码中定义CDialog的对象,然后调用其接口:
代码清单:
- /*! \file: main.cpp
- \brief mian()函数的实现文件
- \author 星点课堂:女儿叫老白
- \Date 2018/8
- */
- #include <QApplication>
- #include <iostream>
- #include "qglobal.h"
- #include "dialog.h"
- using std::cout;
- using std::endl;
- int main(int argc, char * argv[])
- {
- Q_UNUSED(argc);
- Q_UNUSED(argv);
- QApplication app(argc, argv);
- CDialog dlg(NULL);
- dlg.exec();
- return 0;
- }
至此我们为项目添加界面的工作就结束了。
下面我们切入正题,通过pro来整理一下目录。
为了以后进行产品化开发,我们这里引入环境变量,pro中的所有路径都通过环境变量来间接设置。我们引入一个“TRAINDEVHOME”的环境变量,它指向我们代码的src的上级目录。这样,代码的目录结构如下:
TRAINDEVHOME
------bin
------obj
------src
其中bin 、obj、src都是TRAINDEVHOME的子目录。
在pro中使用环境变量的语法:$$(环境变量)。
比如:$$(TRAINDEVHOME)
代码清单:
- OBJECTS_DIR = $(TRAINDEVHOME)/obj/chapter02/ks02_02
- DESTDIR = $(TRAINDEVHOME)/bin
- MOC_DIR = $(OBJECTS_DIR)/moc
- UI_DIR = $(OBJECTS_DIR)/ui
在上述pro的配置中,OBJECTS_DIR是临时文件目录,我们将其设置到obj下对应的子目录。
DESTDIR是目标文件存放目录,就是最终生成的exe存放目录,我们将其放置到TRAINDEVHOME的bin目录。
Qt的moc和uic命令生成的临时文件分别放置到OBJECTS_DIR下面的moc和ui子目录。
每次修改pro之后,请大家再重新执行qmake以便更新相应的Makefile文件,如果需要更新VisualStudio的IDE中的项目文件,则需要执行qmake –tp vc。
然后,就可以重新编译程序了。
结语
----------------------------------------------------------------------------------------------------------------------
本节课程中,我们讲了为项目添加ui文件的过程,简单汇总知识点如下:
*. 如果需要使用界面(ui),pro中务必添加:
QT +=widgets
*. 派生类CDialog头文件中, 包含ui头文件的拼写规则和两个基类的顺序以及拼写。
#include "ui_dialogbase.h" // 头文件名称来自: dialogbase.ui ---> ui_dialogbase.h
class CDialog : public QDialog, public Ui::CDialogBase
*. 派生类的构造函数中一定要调用setupUi(this);
*. 在pro中使用环境变量,通过引用环境变量设置相关目录。
*. 环境变量在使用时应该用下列语法:
$$(环境变量)
*. MOC_DIR:用来存放qt的moc命令生成的临时文件。
*. UI_DIR:用来存放qt的uic命令生成的临时文件。当项目中包含.ui文件时需要用到。
*. FORMS:用来描述项目中包含的.ui文件列表
OK,总结就到这里,祝大家工作愉快!
---------------------------------------------------------------------------------------------------------------------
《Qt入门与提高-GUI产品开发》目录
上一节:KS02-01 通过简单exe介绍pro基本配置
下一节:KS02-03 加点料-增加一张图片
标签:02,文件,代码,KS02,pro,dialogbase,ui,CDialog,目录 来源: https://www.cnblogs.com/baizy77/p/11436205.html