1. 程式人生 > 其它 >Qt - 外掛化程式設計機制

Qt - 外掛化程式設計機制

1、通過外掛擴充套件應用程式功能
A、定義一個介面集(只有純虛擬函式的類),用來與外掛交流。
B、用巨集Q_DECLARE_INTERFACE()將該介面告訴Qt元物件系統。
C、應用程式中用QPluginLoader來載入外掛。
D、用巨集qobject_cast()來判斷一個外掛是否實現了介面。


2、建立外掛
A、宣告外掛類,外掛類繼承自QObject和外掛實現的介面。
B、用巨集Q_INTERFACES()將外掛介面告訴Qt元物件系統。(注意Qt版本)
C、用巨集Q_EXPORT_PLUGIN2()匯出外掛類。(注意Qt版本)
D、用適當的.pro檔案構建外掛。
注:在載入外掛前,QCoreApplication物件必須被初始化。

建立Qt外掛類

 1 ////step 1 定義介面類
 2 class RegExpInterface
 3 {
 4 public:
 5     virtual ~RegExpInterface() {}
 6     virtual QString regexp(const QString &message) = 0;
 7 };
 8 ////step 2 宣告是介面類(介面類中)
 9 // 使用 Q_DECLARE_INTERFACE 巨集,是為了讓Qt元物件系統知道該介面,這樣以來,在執行時便可以識別實現介面的外掛。
10 // Q_DECLARE_INTERFACE(介面類名, 介面標識),第二個引數(RegExpInterface_iid)是一個標識介面的字串,必須唯一。
11 #define RegExpInterface_iid "org.qter.Examples.myplugin.RegExpInterface" 12 Q_DECLARE_INTERFACE(RegExpInterface,RegExpInterface_iid ) 13 #endif // REGEXPINTERFACE_H 14 ////step 3 實現介面 15 class REGEXPLUGINSHARED_EXPORT RegexPlugin : public QObject,RegExpInterface 16 { 17 Q_OBJECT 18 //Q_PLUGIN_METADATA巨集用於描述外掛元資料,第一個引數為外掛的 IID,與介面定義的IID相同
19 //第二個引數FILE是可選的,指定一個本地json檔案,該檔案中描述外掛的相關資料資訊 20 Q_PLUGIN_METADATA(IID RegExpInterface_iid FILE "regexplugindata.json") 21 //Q_INTERFACES 巨集用於告訴 Qt 該類實現的介面。 22 Q_INTERFACES(RegExpInterface) 23 public: 24 RegexPlugin(); 25 // RegExpInterface interface 26 public: 27 QString regexp(const QString &message); 28 }; 29 ////step 4 使用介面 30 // 進入外掛目錄 31 QDir pluginsDir(qApp->applicationDirPath()); 32 pluginsDir.cd("bin"); 33 // 遍歷外掛目錄 34 foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { 35 QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); 36 QObject *plugin = pluginLoader.instance(); 37 if (plugin) { 38 //取回json檔案的內容 39 QJsonObject w = pluginLoader.metaData().value("MetaData").toObject(); 40 qDebug()<<w; 41 regexpInterface = qobject_cast<RegExpInterface *>(plugin); 42 if (regexpInterface) 43 return true; 44 } 45 }
部落格園文作者:Citrusliu 博文地址:https://www.cnblogs.com/citrus