在Qt下,插件有兩種形式,一種是用於QtCreator下,擴展IDE功能。另一種是用於擴展開發者的應用。本文要講的是后者。
定義一個純虛類作為插件接口
- #include <QtPlugin>
- #include <QString>
- class IMyPlugin
- {
- public:
- virtual QString Hello() = 0;
- };
- Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.im.plugin.IMyPlugin")
最后一行的Q_DECLARE_INTERFACE宏告訴Qt這個純虛類是一個插件接口。
第一個參數是接口類名,第二個參數是插件標識符,標識符是大小寫敏感的且必須是唯一的。
接着就是接口的具體實現了
- class MyPlugin : public QObject, public IMyPlugin
- {
- Q_OBJEC
- Q_PLUGIN_METADATA(IID "com.google.myplugin" FILE "C:/a.json")
- Q_INTERFACES(IMyPlugin)
- public:
- virtual QString Hello() Q_DECL_OVERRIDE;
- };
實現類必須繼承自QObject和插件接口類。Q_PLUGIN_METADATA宏用於描述插件元數據,第一個參數IID是必須的,同插件標識一樣
而第二個參數FILE是可選的,指定一個本地json文件,該文件中可以描述插件的相關數據信息
(上面代碼中指向的a.json內容為{"name":"jack", "age":18},稍后可以看到)
測試方法的實現沒啥好說了,只是返回一個字符串
- QString MyPlugin::Hello()
- {
- return "Hello";
- }
調用的話也比較簡單,就是通過QPluginLoader類
- {
- QPluginLoader loader("C:/MyPlugin.dll");
- if (loader.load())
- {
- QObject *obj = loader.instance();
- if (obj)
- {
- IMyPlugin *plugin = qobject_cast<IMyPlugin*>(obj);
- if (plugin)
- {
- // 測試插件方法
- qDebug() << plugin->Hello();
- // 輸出插件元數據
- qDebug() << loader.metaData();
- }
- // 需要手動釋放
- delete obj;
- }
- }
- }
最后運行結果如圖

http://blog.csdn.net/aqtata/article/details/38986271
