1. 程式人生 > >Qt官方類程中DBus Controlled Car學習

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函式是如何進行通訊的?

答:他們採用的程序通訊。即每個模組對應一個程序。

但是為什麼不直接將各個模組的類標頭檔案進行包含,然後進行物件的建立。如果模組較多的話,開的程序也會增多,這樣做的好處是什麼。