1. 前言
qtcanpool的工程管理来源于qtcreator源码,并进行了优化和改进,使之变为更通用的工程管理模板。
2. 演进
工程管理,不对,工程管理模板,这个有什么意义?
先来看看一个程序的主要组织结构:

在开发QT程序的时候,大概会有下面几种组织形式:
- 一个可执行程序
- 一个可执行程序、若干个用户库
- 一个可执行程序、若干个用户库、若干个用户插件
下面看看QT程序的工程是如何演进的。
2.1. 一个可执行程序
功能:实现一个窗口类HelloCanpool,其包含一个QPushButton,Button文本显示为Hello Canpool。HelloCanpool的实例作为QMainWindow的中心窗体,效果图如下:

2.1.1. 创建
如何创建工程可以参考:qtcreator 手册

主要代码如下:
- hellocanpool.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000
SOURCES += \
hellocanpool.cpp \
main.cpp \
mainwindow.cpp
HEADERS += \
hellocanpool.h \
mainwindow.h
- hellocanpool.cpp
#include "hellocanpool.h"
#include <QPushButton>
#include <QHBoxLayout>
HelloCanpool::HelloCanpool(QWidget *parent)
: QWidget(parent)
{
QPushButton *btn = new QPushButton("Hello Canpool");
QHBoxLayout *lay = new QHBoxLayout();
lay->addWidget(btn);
setLayout(lay);
}
- mainwindow.cpp
#include "mainwindow.h"
#include "hellocanpool.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
HelloCanpool *hc = new HelloCanpool();
setCentralWidget(hc);
resize(300, 100);
}
2.1.2. 编译
编译后,输出的可执行程序如下:

看破
- 看:可执行程序为什么在debug目录,而不是release目录?
破:因为qtcreator构建时选的是debug模式,所以默认在debug目录 - 看:可执行程序一般不是在bin目录吗?
破:是的,一般是在bin目录,可以在pro文件中通过DESTDIR设置 - 看:可执行程序名称为什么是hellocanpool,可以叫HelloCanpool吗?
破:可以在pro文件中通过TARGET设置,如果没有设置,默认就是工程文件名 - 看:为什么生成的是可执行程序exe,而不是库呢?
破:可以在pro文件中通过TEMPLATE = app设置,如果没有设置,默认就是生成app。
备注:更多的配置和使用可以参考 qmake手册
2.1.3. 改进
将可执行程序改名为HelloCanpool,并输出到bin目录下:
- hellocanpool.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
DESTDIR = bin
TARGET = HelloCanpool
CONFIG += c++11

这些就是一个可执行程序大致的开发内容了,之后可以不断的丰富这个可执行程序的功能。
2.1.4. 思考
一个可执行程序如果采用qmake构建方式,那么pro文件就是它的配置管理文件,通过DESTDIR、TARGET、TEMPLATE等完全可以管理好这个项目,这还需要什么工程管理模板吗?
思考一下:一个可执行程序可能存在哪些问题?
- 随着软件功能的增加,这个可执行程序会越来越大,大好像也没啥问题。
- 如果软件是个人开发的,也不用和别人协作,一个可执行程序也没啥问题。但有没有一种可能,一个人可能会开发多个软件,不同的软件之间可能有共用的功能,不过可以互相拷贝源文件,但文件数目较多呢,比如几十个,也来回拷贝吗?可以改为拷贝目录(模块)。
- 如果软件是多人协作、分工开发,该怎么划分呢?一个可执行程序可以划分不同的类模块,不同的人负责不同的类模块,也可解决协作问题。
- 有没有一种可能,开发的软件会提供给第三方做二次开发,此时,也把源代码拷贝给第三方吗?这对于开源软件来说,也不成问题。
把所谓的模块封装为库,提供开放接口的头文件,那么是不是可以更好的解决上面的问题呢?
2.2. 一个可执行程序、一个用户库
功能:将上一个可执行程序的窗口类HelloCanpool封装成hello库,提供给可执行程序使用。
2.2.1. 新建共享库


这里Type选择Shared Library,Qt module选择Widgets,类名和文件名保持不变。
主要代码如下:
- hello.pro
QT += widgets
TEMPLATE = lib
DEFINES += HELLO_LIBRARY
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES +

本文详细介绍了一个基于Qt的工程管理模板的构建过程,包括从简单的可执行程序到包含库和插件的复杂项目的演进,以及如何管理和优化这些项目。
最低0.47元/天 解锁文章
967





