Qt 教程 - 如何作一个多层次工程组织

写在前面

由于项目中咱们须要把模块分的比较明确,这样既方便你们分工合做,也方便往后模块重复使用。昨天初次摸索了一下,碰到了BUG。解决了后,决定把这种开发方式和你们分享一下。linux

1. 新建工程

新建工程时,咱们选择 Other Project -> Subdirs Project 。这个工程即创建一个完整的父工程,在父工程下包含不少子工程,而每一个子工程能够看成一个模块进行看待。我将这个工程命名为multi_project。 git

这里写图片描述
这里写图片描述

1.1 添加子工程

通常状况下,会自动弹出一个建立子工程的窗口,若是不当心关掉了也没事,咱们经过这样的方式继续建立。咱们右击父工程的标题,选择 New Subproject… github

这里写图片描述

1.2 做为库函数功能的子工程

通常咱们不少子工程中,只有少部分是启动工程,大部分是做为库函数引用进来的,咱们最好先建立做为库函数性质的子工程,而后在建立做为启动项目的子工程。做为库函数的子工程请选择 Library -> C++ Library bash

这里写图片描述
它有三个类型选项,这里咱们以 Shared Library为例。我将本子工程的名称命名为 CustomWidget
这里写图片描述

1.3 pro文件参数说明

咱们打开 新建的子工程的 .pro文件,这里有些知识要和你们说明下。app

TARGET = CustomWidget # 指定目标文件的名称。默认状况下包含的项目文件的基本名称。
TEMPLATE = lib	# 模板告诉qmake为这个应用生成哪一种文件。
复制代码

在本部分 TEMPLATE = lib 代表将会生成lib文件,TARGET = CustomWidget 表示生成的文件名叫这个。即本模块生成的文件名将会叫 CustomWidget.lib (在Windows下) 听说在Linux下会生成 libCustomWidget.so函数

咱们在这个工程的 .pro文件中加入一行布局

DESTDIR = ../bin #指定在何处放置目标文件。
复制代码

下面两图试着编译了一下这个工程,来帮助你们理解DESTDIR的用处,咱们在多工程多文件组织时有必要用到这个东西。 测试

这里写图片描述
这里写图片描述

1.4 创建应用程序子函数

这里是至关于创建个可执行APP,须要创建什么类型你们根据本身须要进行选择。我这里创建Qt Widgets Application。我将该工程命名为application,我将后面的自动生成ui Form的选项去掉了,打算用代码控制布局。 ui

这里写图片描述

1.5 修改APP工程的依赖关系

咱们一样在app工程下添加一句DESTDIR = ../bin 确保生成的文件在同一个文件夹 但APP工程将会用到lib工程的一些内同容,因此咱们要将它做为静态库文件引入进来。 咱们在APP工程的头文件下加入以下几行this

DESTDIR = ../bin

win32{#表示Windows环境的特殊设置,这个大括号不能单独放在下一行,不然编译会报错
LIBS += ../bin/CustomWidget.lib
}

unix {#表示linux环境的特殊设置,这个大括号不能单独放在下一行,不然编译会报错
LIBS += ../bin/libCustomWidget.so
}

复制代码

1.6 更改父工程的 pro 文件

按照教程来作的话,父工程的pro文件内应该只有这几行。

TEMPLATE = subdirs

SUBDIRS += \
    CustomWidget \
    application
复制代码

咱们在后面加上一行,以下方所示。

TEMPLATE = subdirs

SUBDIRS += \
    CustomWidget \
    application

CONFIG += ordered

复制代码

该字段的涵义是:使用subdirs模板时,此选项指定应该按照目录列表的顺序处理它们。 这样能保证lib工程在应用程序工程前执行(由于app工程里用到了lib工程的编译结果,因此必须有前后的编译顺序),若是新建顺序错了,能够在这里手动更改上方 SUBDIRS 内的顺序,将lib工程放在前边。

1.7 目前状态

到目前为止,工程应该是这样的状态。

这里写图片描述

2.编写简易的自定义库

2.1 增长一个继承 QLabel 的类

咱们右击 CustomWidget工程名,选择 Add New。而后再选择C++ -> C++ Class

这里写图片描述

新建完成后,能够完善咱们的类。

这里有一点须要注意,咱们看到列表中有个customwidget_global.h文件。文件内容以下“

// customwidget_global.h

#ifndef CUSTOMWIDGET_GLOBAL_H
#define CUSTOMWIDGET_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(CUSTOMWIDGET_LIBRARY)
# define CUSTOMWIDGETSHARED_EXPORT Q_DECL_EXPORT
#else
# define CUSTOMWIDGETSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // CUSTOMWIDGET_GLOBAL_H
复制代码

其中这个CUSTOMWIDGETSHARED_EXPORT 字段须要注意,它是Qt 的宏,你新增的类,要在类的声明中加入该字段才可以生成在 lib文件里,我就是由于没有注意到这个问题,才调试了好长时间。

2.2 customLabel类

头文件

#ifndef CUSTOMLABEL_H
#define CUSTOMLABEL_H

#include <QLabel>
#include "customwidget_global.h"


class CUSTOMWIDGETSHARED_EXPORT CustomLabel
        : public QLabel
{
    Q_OBJECT
public:
    CustomLabel(QLabel *parent = 0);
};

#endif // CUSTOMLABEL_H
复制代码

cpp文件

#ifndef CUSTOMLABEL_H
#define CUSTOMLABEL_H

#include <QLabel>
#include "customwidget_global.h"


#include "customlabel.h"

CustomLabel::CustomLabel(QLabel *parent):
    QLabel(parent)
{
    this->QLabel::setText(QObject::tr("这是一个自定义Label文件"));
}

复制代码

2.3 CustomWidget 类

头文件

#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H

#include "customwidget_global.h"

#include <QWidget>
#include "customlabel.h"

class CUSTOMWIDGETSHARED_EXPORT CustomWidget
        :public QWidget
{

public:
    CustomWidget(QWidget *parent =0);
    ~CustomWidget();
private:
    CustomLabel * label1;
    CustomLabel * label2;
    QLayout * layout;
};

#endif // CUSTOMWIDGET_H


复制代码

CPP文件

#include "customwidget.h"

#include<QHBoxLayout>

CustomWidget::CustomWidget(QWidget *parent):
    QWidget(parent)
{
    label1 = new CustomLabel();
    label2 = new CustomLabel();
    label2->setText(QObject::tr("继承测试"));

    // 设置布局
    layout = new QHBoxLayout;
    layout->addWidget(label1);
    layout->addWidget(label2);

    // 将布局加入到widget
    this->setLayout(layout);

}

/****************************
 * 析构函数用来释放空间
 * *************************/
CustomWidget::~CustomWidget(){

    if(label1 == NULL)
    {
        delete label1;
    }
    if(label2 == NULL)
    {
        delete label2;
    }
    if(layout == NULL)
    {
        delete layout;
    }

}


复制代码

3.APP 程序

3.1 MainWindow类实现

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "../CustomWidget/customwidget.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    CustomWidget * widget;

};

#endif // MAINWINDOW_H

复制代码

CPP文件

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    widget = new CustomWidget();
    this->setCentralWidget(widget); // 设置widget
    this->setFixedSize(800,600);
    this->setWindowTitle(QObject::tr("这是测试窗口"));
}

MainWindow::~MainWindow()
{
    if(this->widget == NULL)
    {
        delete widget;
    }
}

复制代码

3.2 编译运行

咱们编译运行,能够看到效果以下图所示。

这里写图片描述
如此,咱们便实现了在多个子工程中分模块编写。经过创建多个lib子工程,能够将模块话的任务分给更多的同伴来合做,谢谢你们

4. 示例工程分享

下载连接 谢谢各位姥爷支持。

参考连接

pro文件里字段解释 liang19890820

相关文章
相关标签/搜索