网页版课程源码 提取码:1uy7
前几天,在使用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 加点料-增加一张图片
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。