制作Qt應用程序的插件(使用QtPlugin),對比DLL它是全平台通用的


在Qt下,插件有兩種形式,一種是用於QtCreator下,擴展IDE功能。另一種是用於擴展開發者的應用。本文要講的是后者。

定義一個純虛類作為插件接口

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. #include <QtPlugin>  
  2. #include <QString>  
  3.   
  4. class IMyPlugin  
  5. {  
  6. public:  
  7.     virtual QString Hello() = 0;  
  8. };  
  9.   
  10. Q_DECLARE_INTERFACE(IMyPlugin, "com.apple.im.plugin.IMyPlugin")  

 

最后一行的Q_DECLARE_INTERFACE宏告訴Qt這個純虛類是一個插件接口。
第一個參數是接口類名,第二個參數是插件標識符,標識符是大小寫敏感的且必須是唯一的。

接着就是接口的具體實現了

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. class MyPlugin : public QObject, public IMyPlugin  
  2. {  
  3.     Q_OBJEC  
  4.     Q_PLUGIN_METADATA(IID "com.google.myplugin" FILE "C:/a.json")  
  5.     Q_INTERFACES(IMyPlugin)  
  6. public:  
  7.     virtual QString Hello() Q_DECL_OVERRIDE;  
  8. };  

 

實現類必須繼承自QObject和插件接口類。Q_PLUGIN_METADATA宏用於描述插件元數據,第一個參數IID是必須的,同插件標識一樣
而第二個參數FILE是可選的,指定一個本地json文件,該文件中可以描述插件的相關數據信息
(上面代碼中指向的a.json內容為{"name":"jack", "age":18},稍后可以看到)

測試方法的實現沒啥好說了,只是返回一個字符串

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. QString MyPlugin::Hello()  
  2. {  
  3.     return "Hello";  
  4. }  


調用的話也比較簡單,就是通過QPluginLoader類

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. {  
  2.     QPluginLoader loader("C:/MyPlugin.dll");  
  3.     if (loader.load())  
  4.     {  
  5.         QObject *obj = loader.instance();  
  6.         if (obj)  
  7.         {  
  8.             IMyPlugin *plugin = qobject_cast<IMyPlugin*>(obj);  
  9.             if (plugin)  
  10.             {  
  11.                 // 測試插件方法  
  12.                 qDebug() << plugin->Hello();  
  13.   
  14.                 // 輸出插件元數據  
  15.                 qDebug() << loader.metaData();  
  16.             }  
  17.   
  18.             // 需要手動釋放  
  19.             delete obj;  
  20.         }  
  21.     }  
  22. }  

 

最后運行結果如圖


 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM