由於項目中咱們須要把模塊分的比較明確,這樣既方便你們分工合做,也方便往後模塊重複使用。昨天初次摸索了一下,碰到了BUG。解決了後,決定把這種開發方式和你們分享一下。linux
新建工程時,咱們選擇 Other Project -> Subdirs Project 。這個工程即創建一個完整的父工程,在父工程下包含不少子工程,而每一個子工程能夠看成一個模塊進行看待。我將這個工程命名爲multi_project。 git
通常狀況下,會自動彈出一個建立子工程的窗口,若是不當心關掉了也沒事,咱們經過這樣的方式繼續建立。咱們右擊父工程的標題,選擇 New Subproject… github
通常咱們不少子工程中,只有少部分是啓動工程,大部分是做爲庫函數引用進來的,咱們最好先建立做爲庫函數性質的子工程,而後在建立做爲啓動項目的子工程。做爲庫函數的子工程請選擇 Library -> C++ Library bash
咱們打開 新建的子工程的 .pro文件,這裏有些知識要和你們說明下。app
TARGET = CustomWidget # 指定目標文件的名稱。默認狀況下包含的項目文件的基本名稱。
TEMPLATE = lib # 模板告訴qmake爲這個應用生成哪一種文件。
複製代碼
在本部分 TEMPLATE = lib
代表將會生成lib文件,TARGET = CustomWidget
表示生成的文件名叫這個。即本模塊生成的文件名將會叫 CustomWidget.lib
(在Windows下) 聽說在Linux下會生成 libCustomWidget.so
。函數
咱們在這個工程的 .pro文件中加入一行佈局
DESTDIR = ../bin #指定在何處放置目標文件。
複製代碼
下面兩圖試着編譯了一下這個工程,來幫助你們理解DESTDIR的用處,咱們在多工程多文件組織時有必要用到這個東西。 測試
這裏是至關於創建個可執行APP,須要創建什麼類型你們根據本身須要進行選擇。我這裏創建Qt Widgets Application。我將該工程命名爲application,我將後面的自動生成ui Form的選項去掉了,打算用代碼控制佈局。 ui
咱們一樣在app工程下添加一句DESTDIR = ../bin
確保生成的文件在同一個文件夾 但APP工程將會用到lib工程的一些內同容,因此咱們要將它做爲靜態庫文件引入進來。 咱們在APP工程的頭文件下加入以下幾行this
DESTDIR = ../bin
win32{#表示Windows環境的特殊設置,這個大括號不能單獨放在下一行,不然編譯會報錯
LIBS += ../bin/CustomWidget.lib
}
unix {#表示linux環境的特殊設置,這個大括號不能單獨放在下一行,不然編譯會報錯
LIBS += ../bin/libCustomWidget.so
}
複製代碼
按照教程來作的話,父工程的pro文件內應該只有這幾行。
TEMPLATE = subdirs
SUBDIRS += \
CustomWidget \
application
複製代碼
咱們在後面加上一行,以下方所示。
TEMPLATE = subdirs
SUBDIRS += \
CustomWidget \
application
CONFIG += ordered
複製代碼
該字段的涵義是:使用subdirs模板時,此選項指定應該按照目錄列表的順序處理它們。 這樣能保證lib工程在應用程序工程前執行(由於app工程裏用到了lib工程的編譯結果,因此必須有前後的編譯順序),若是新建順序錯了,能夠在這裏手動更改上方 SUBDIRS
內的順序,將lib工程放在前邊。
到目前爲止,工程應該是這樣的狀態。
咱們右擊 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文件裏,我就是由於沒有注意到這個問題,才調試了好長時間。
頭文件
#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文件"));
}
複製代碼
頭文件
#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;
}
}
複製代碼
頭文件
#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;
}
}
複製代碼
咱們編譯運行,能夠看到效果以下圖所示。
下載連接 謝謝各位姥爺支持。
pro文件裏字段解釋 liang19890820