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

相關文章
相關標籤/搜索