找回密码
 立即注册
收起左侧

【独家连载】Qt入门与提高:K02-02整理一下目录吧

1
回复
7035
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-26 17:21:05 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2019-8-24 23:18 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
网页版课程源码 提取码:1uy7

引言
----------------------------------------------------------------------------------------------------------------------
       前几天,在使用Qt编程时,为项目增加了几个ui文件。偶然看一下源代码目录,发现源代码目录下的临时文件和临时目录太多了,简直杂乱不堪,虽然我们的代码是通过svn管理的,提交时有过滤设置,这些临时文件不会被入库,但是有时候需要备份一下源代码目录并打包,如果带着这么多临时文件(文件尺寸还是非常大的),那可太不方便了。所以今天我们就讲一下该如何通过pro文件的配置来整理源代码目录。

正文
----------------------------------------------------------------------------------------------------------------------
      先不忙,我们顺便讲一下为项目添加界面(ui)的方法。大概分为四步:
        1, 使用designer绘制ui文件并保存。
        2, 编写ui的派生类。
        3, 将相关文件添加到pro。
        4, 使用派生类
        我们分步骤讲解。
        第一步,使用designer绘制某对话框资源文件(.ui),请注意,对话框类名:CDialogBase,ui文件名:dialogbase.ui。
        这两个名称请仔细记下,因为后面会用到。
        
        第二步,我们编写ui的派生类:

代码清单:
  1. #ifndef DIALOG_H
  2. #define DIALOG_H

  3. #include "ui_dialogbase.h" // 头文件名称来自: dialogbase.ui  ---> ui_dialogbase.h


  4. // 第一个父类的名称来自ui文件中对话框的类名:对象查看器中的类名
  5. // 第二个父类的名称来自ui文件中对话框基类的名称(objeceName属性): CDialogBase
  6. class CDialog : public QDialog, public Ui::CDialogBase
  7. {
  8. public:
  9.         CDialog(QWidget* pParent);
  10.         ~CDialog();
  11. };

  12. #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:

代码清单:
  1. /*! \file: dialog.h
  2. \brief 示例实现文件

  3. \author 星点课堂:女儿叫老白
  4. \Date 2018/9
  5. */
  6. #include "dialog.h"


  7. CDialog::CDialog(QWidget* pParent) : QDialog(pParent)
  8. {
  9.         setupUi(this);

  10. }

  11. CDialog::~CDialog()
  12. {
  13.         
  14. }
复制代码

        dialog.cpp比较简单,我们不做过多讨论,唯一需要注意的一点就是在构造函数中一定要调用setupUi(this);否则界面无法正常显示。
        第三步,将相关文件添加到pro。我们目前添加了一个界面文件(dialogbaes.ui),添加了CDialog类的定义(.h)和实现文件(.cpp)。那么我们把他们添加到pro:

代码清单:
  1. QT                        += widgets

  2. FORMS                += dialogbase.ui

  3. HEADERS        += ks02_02.pro \
  4.                                 dialog.h
  5.                
  6. SOURCES    +=  main.cpp \
  7.                                 dialog.cpp
复制代码

        上述代码中,FORMS配置项用来描述项目中用到的ui文件,HEADERS和SOURCES两个配置项在前面章节介绍过。如果要使用界面,请确保QT+=widgets正确配置。
        
        第四步,我们在代码中使用CDialog。我们需要先包含CDialog的头文件(dialog.h),然后在代码中定义CDialog的对象,然后调用其接口:

代码清单:
  1. /*! \file: main.cpp
  2. \brief mian()函数的实现文件

  3. \author 星点课堂:女儿叫老白
  4. \Date 2018/8
  5. */
  6. #include <QApplication>

  7. #include <iostream>

  8. #include "qglobal.h"
  9. #include "dialog.h"


  10. using std::cout;
  11. using std::endl;

  12. int main(int argc, char * argv[])
  13. {
  14.         Q_UNUSED(argc);
  15.         Q_UNUSED(argv);

  16.         QApplication app(argc, argv);

  17.         CDialog dlg(NULL);
  18.         dlg.exec();
  19.         return 0;
  20. }
复制代码

        至此我们为项目添加界面的工作就结束了。
        下面我们切入正题,通过pro来整理一下目录。
        为了以后进行产品化开发,我们这里引入环境变量,pro中的所有路径都通过环境变量来间接设置。我们引入一个“TRAINDEVHOME”的环境变量,它指向我们代码的src的上级目录。这样,代码的目录结构如下:
TRAINDEVHOME
------bin
------obj
------src
        其中bin 、obj、src都是TRAINDEVHOME的子目录。
        在pro中使用环境变量的语法:$$(环境变量)。
        比如:$$(TRAINDEVHOME)
        
代码清单:
  1. OBJECTS_DIR = $(TRAINDEVHOME)/obj/chapter02/ks02_02

  2. DESTDIR    = $(TRAINDEVHOME)/bin

  3. MOC_DIR        = $(OBJECTS_DIR)/moc
  4. 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,总结就到这里,祝大家工作愉快!

上一节:KS02-01   通过简单exe介绍pro基本配置
下一节:KS02-03   加点料-增加一张图片
回复

使用道具 举报

累计签到:319 天
连续签到:1 天
2018-9-27 08:41:34 显示全部楼层
收藏收藏收藏收藏收藏收藏收藏收藏
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了