1. 程式人生 > 其它 >Qt 建立包含多個專案的工程以及各專案之間的呼叫

Qt 建立包含多個專案的工程以及各專案之間的呼叫

在用QT做一個包含許多個小專案的大專案時,遇到了無法把多個專案合併到一個Pro的問題,後來經過艱苦嘗試,終於可以在一個大專案下包含許多小專案了。但同時各個專案之間的呼叫又出現了問題,目前已解決。下面就把我的經驗分享給大家。

一、建立包含多個小專案的大專案
1、第一種情況:在新建的empty project 下建立新的子專案
2、第二種情況:在新建的empty project 下新增已存在的專案
3、第三種情況:在已經編好的專案下建立新的子專案
4、第四種情況:在已經編好的專案下新增已存在的專案
1、在新建的empty project 下建立新的子專案。可以分為以下幾步:
(1)檔案 → 新建檔案和專案 → 其他專案 → empty qmake project


(2)填寫工程名、建立路徑等資訊。建立完成後如下圖所示。(我建立的大專案叫untitled)

 (3)開啟生成的Pro檔案 → 手動輸入TEMPLATE = subdirs

 (4)右鍵工程資料夾 → 新子專案 → 選擇你想建立的專案

(這裡我建立一個widget,子專案名字叫untitled1)
建立完成後如下圖所示

2、在新建的empty project 下新增已存在的專案,步驟如下
(1)這裡我們繼續在1已經建好的empty project下新增,建立empty project的步驟和1一樣。
(2)將你要新增的子專案的資料夾移到建立的大專案資料夾下,和大專案的Pro檔案儲存在一起。如下如所示(SignalAndSlot是我要新增的子專案):


 (2)右鍵工程資料夾 → add existing projects(QT版本5.14之前的版本好像沒有這個選項,這個我也沒有辦法)→ 在彈出的視窗中選擇你要新增的專案的Pro檔案(我選中的是SignalAndSlot.Pro)
新增好之後如下圖所示:

至此,第一種和第二種情況就介紹完畢了,但是不管是新建的還是新增的子專案在執行時還是獨立的。而且每一個子專案下都有一個main.cpp,但是程式的入口只能有一個,假設我現在要在新建的子專案untitled1中呼叫新增的子專案SignalAndSlot,那麼就刪除掉SignalAndSlot下的main.cpp。呼叫的步驟如下:
(1)刪除SignalAndSlot下的main.cpp


(2)為SignalAndSlot建立SignalAndSlot_global.h標頭檔案
右鍵SignalAndSlot → addnew → c++ → c++ header file

 (3)在SignalAndSlot_global.h中輸入以下程式碼,注意程式碼中的SIGNALANDSLOT要根據自己的專案名稱做改變。

 1 #ifndef SIGNALANDSLOT_GLOBAL_H
 2 #define SIGNALANDSLOT_GLOBAL_H
 3 
 4 #include <QtCore/qglobal.h>
 5 
 6 #if defined(SIGNALANDSLOT_LIBRARY)
 7 #  define SIGNALANDSLOT_EXPORT Q_DECL_EXPORT
 8 #else
 9 #  define SIGNALANDSLOT_EXPORT Q_DECL_IMPORT
10 #endif
11 
12 #endif // SIGNALANDSLOT_GLOBAL_H

(4)在SignalAndSlot.Pro裡面增加如下程式碼

1 TARGET = SignalAndSlot
2 TEMPLATE = lib
3 DEFINES += SignalAndSlot_LIBRARY

(5)右鍵untitled1 → 新增庫 → 內部庫 → 下一步 → 完成

 新增完成之後untitled1.Pro內會自動生成編譯設定和路徑程式碼,如下所示:

1 win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../SignalAndSlot/release/ -lSignalAndSlot
2 else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../SignalAndSlot/debug/ -lSignalAndSlot
3 else:unix: LIBS += -L$$OUT_PWD/../SignalAndSlot/ -lSignalAndSlot
4 
5 INCLUDEPATH += $$PWD/../SignalAndSlot
6 DEPENDPATH += $$PWD/../SignalAndSlot

這樣,untitled1就能呼叫SignalAnGSlot下的函數了。但是要注意只能呼叫SignalAnGSlot的Pbulic下面的函式。例如我要呼叫SignalAnGSlot下面的student類下面的函式。
student.h如下所示(注意我呼叫的aaa函式在student.h中宣告時前面加了static關鍵字,這是它能被呼叫的關鍵):

 1 #define STUDENT_H
 2 
 3 #include <QObject>
 4 
 5 class Student : public QObject
 6 {
 7     Q_OBJECT
 8 public:
 9 
10     explicit Student(QObject *parent = nullptr);
11 
12     void  treat();
13     void  treat(QString foodName);
14     static void aaa();
15 signals:
16 
17 //早期的Qt版本必須寫到public slot 下,高階版本可以寫到Public或者全域性下
18 //返回值是void,需要宣告也需要實現
19 //可以有引數,可以發生過載
20 };
21 
22 #endif // STUDENT_H

untitled1的main.cpp中這樣寫:

 1 #include "widget.h"
 2 #include "student.h"
 3 
 4 #include <QApplication>
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication a(argc, argv);
 9     Widget w;
10     w.show();
11     Student::aaa();
12     Student();
13     return a.exec();
14 }

至於第三種第四種情況改天再寫,今天不想寫了,改天再寫。如果你覺得有用的話給我點個贊吧,反正也不要錢。