Qt官方類程中DBus Controlled Car學習
剛入職,需要使用Qt開發。決定通過看Qt官方例程來學習Qt。水平有限,請指出。
第一步:先了解工程中的出現的巨集定義
先了解一個巨集
Q_UNUSED
這個巨集沒有實際意義,只是為了避免編譯器的警告。
例如在程式中宣告變數name沒有使用它,在編譯的時候編譯器會發出沒有使用的警告。但對於此類警告,對我們開發的意義不大,因此可以不需要管它。此時便可使用
Q_UNUSED(name);//編譯器忽略了name沒有使用的警告。
第二步:多工程中各個模組之間的關係
由於這個工程下有car和contrler兩個類,先通過UML將兩個類的邏輯關係進行分析。在仔細閱讀程式碼之後,可以發現,car和contrler之間的關係是一種聚合的關係(一種整體合併的關係,與組合關係的區別是聚合中部分可以單獨存在,而組合中部分不能單獨存在),這樣可以滿足優先使用組合而不是用繼承的習慣。
根據圖中的對類的定義,可以畫出該工程具體的類圖如上圖所示。
我們可以觀察到,car和Controller是一種聚合關係,即是一種“has-a”。
第三步:多工程配置方法
在這個工程中,car和Controller是兩個獨立的模組,這符合使用Qt進行開發大型專案時,涉及到多個模組主要利用到的思想是模組化思想,目的是為了降低程式的複雜度,使程式設計、除錯和維護等方便。
對於Qt中多工程而言。
如果需要管理多工程(pro),比如:庫工程、介面工程,其中,每一個工程均可單獨編譯成功,但存在依賴關係。也就是說,lib2依賴於lib1,而UI依賴於lib2。
配置如下:
- 配置TEMPLATE為subdirs設定多工程
- 配置SUBDIRS,指定需要新增的工程模組
- 配置CONFIG為ordered指定順序編譯
因此,在該工程中總的檔案配置中新增:
TEMPLATE = subdirs //表示該工程為多工程
SUBDIRS = car \ //為該工程新增car工程模組
controller //為該工程新增controller工程模組
並且在car和controller各自模組中都有說明自身的來源:
安裝+ =目標的來源
# install
target.path = $$[QT_INSTALL_EXAMPLES]/dbus/remotecontrolledcar/controller
INSTALLS += target
target.path = $$[QT_INSTALL_EXAMPLES]/dbus/remotecontrolledcar/car
INSTALLS += target
第四步:理解Qt Creator為我們做了些什麼?
1:因為controller類是集成了QWdigets類,因此,Qt編譯器會自動在debug或者relea目錄下生成ui_controller.h的檔案。
2:因為該工程為模組化程式設計,由多個獨立模組組成的。此時編譯器也會自動生成一些介面檔案。例如,在本例中,由於controller中定義了car類,因此生成了car_interface類的介面檔案,在此檔案中,該介面類
OrgExampleExamplesCarInterfaceInterface在名稱空間下:
namespace org {
namespace example {
namespace Examples {
typedef ::OrgExampleExamplesCarInterfaceInterface CarInterface;
}
}
}
因此,在controller類中對car初始化:
car = new org::example::Examples::CarInterface("org.example.CarExample", "/Car",
QDBusConnection::sessionBus(), this);
其中,該介面的建構函式原型為:
OrgExampleExamplesCarInterfaceInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);
接下來我們就可以開始對原始碼的操作進行閱讀和分析了。
第五步:原始碼閱讀
請移步QtCreator中的例項。
第六步:疑問?
在工程中具體的各個獨立的模組都有自己的main函式,但是一個exe檔案即一個程式只有一個main函式入口,因此,在本例中,各個模組之間出現的兩個main函式是如何進行通訊的?
答:他們採用的程序通訊。即每個模組對應一個程序。
但是為什麼不直接將各個模組的類標頭檔案進行包含,然後進行物件的建立。如果模組較多的話,開的程序也會增多,這樣做的好處是什麼。