之前我為了讓讀檔的程式碼更精簡,花了不少時間把實際建構的過程移動到另一個檔案。
而更早之前,為了能解偶合,我也弄了一個簡單的依賴注入。
但就在我把這些鳥工作完成之際,我看到了有關
插件的設計。
唉,有好幾天的日子都白寫程式了...
Qt的插件系統基本上是簡單工廠模式,聽起來不怎麼樣。
但它之所以能比DI好是因為它可以在執行期間依需求載入。
所以說,今天我們要加入新的物件,只需要開一個小專案,寫相關的程式碼,然後一切就搞定。
設計方式很簡單:首先你要有一個純抽象類別。
完成後你要在header最後加上 Q_DECLARE_INTERFACE([類別全名], [字串])
類別全名要包含其名稱空間,而字串是用來識別用的,所以不能和別人重複。
第二步是實際工作的物件
header檔
class GeometryCtorPlugin : public QObject, public [介面]
{
Q_OBJECT
Q_INTERFACES([介面])
public:
explicit GeometryCtorPlugin(QObject *parent = 0);
};cpp檔
Q_EXPORT_PLUGIN2([專案名稱], GeometryCtorPlugin)最後在實際要跑的原始碼中加上
//......
#include <QtPlugin>
#include <QPluginLoader>
//......
Q_IMPORT_PLUGIN([專案名稱])
//......靜態連結
foreach(QObject *plugin, QPluginLoader::staticInstances()) {
[介面] *interface = qobject_cast<[介面]*>(plugin);
//......
}
//......動態連結
QDir dir = [插件所在目錄];
foreach(const QString &fileName, dir.entryList(QDir::Files)) {
QPluginLoader loader(dir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
//......
}
//......
收工