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