Qt5的插件机制(7)--插件开发示例代码(Lower-level API)

时间:2021-04-26 23:15:29

插件代码

接口类头文件 MyPluginInterface.h

[cpp]  view plain  copy   Qt5的插件机制(7)--插件开发示例代码(Lower-level API) Qt5的插件机制(7)--插件开发示例代码(Lower-level API)
  1. #ifndef INTERFACES_H  
  2. #define INTERFACES_H  
  3.   
  4. #include <QtPlugin>  
  5.   
  6. #define QtPluginDemo_iid "org.qt-project.Qt.PluginDemo"  
  7.   
  8. class MyPluginInterface  
  9. {  
  10. public:  
  11.     virtual int add(int,int) = 0 ;  // 正确写法  
  12.     // virtual int add(int,int);    // 不太妥的写法(虽然这也是正确的虚函数声明语句)  
  13.         // 注:接口类中的虚函数都应有实体,或设置为0(推荐),这样  
  14.         // C++的编译器才能为接口类生成虚函数表。否则,如果没有实现  
  15.         // 接口类的虚函数也没有将其设为0,程序在在链接时可能会失败,  
  16.         // 或者链接成功但最后生成的库无法加载(库中有未定义的符号)  
  17. };  
  18.   
  19. Q_DECLARE_INTERFACE ( MyPluginInterface, QtPluginDemo_iid ) ;  
  20.   
  21. #endif  

插件头文件 MyPlugin.h

[cpp]  view plain  copy   Qt5的插件机制(7)--插件开发示例代码(Lower-level API) Qt5的插件机制(7)--插件开发示例代码(Lower-level API)
  1. #ifndef MYPLUGIN__H  
  2. #define MYPLUGIN__H  
  3.   
  4. #include <QObject>  
  5. #include <QDebug>  
  6. #include "MyPluginInterface.h"  
  7.   
  8.   
  9. class MyPlugin : public QObject, public MyPluginInterface  
  10. {  
  11.     Q_OBJECT  
  12.     Q_PLUGIN_METADATA ( IID QtPluginDemo_iid FILE "MyPlugin.json")  
  13.     Q_INTERFACES(MyPluginInterface)  
  14.   
  15. public:  
  16.     int add(int,int);  
  17. };  
  18.   
  19. #endif  

插件源文件 MyPlugin.cpp

[cpp]  view plain  copy   Qt5的插件机制(7)--插件开发示例代码(Lower-level API) Qt5的插件机制(7)--插件开发示例代码(Lower-level API)
  1. #include "MyPlugin.h"  
  2.   
  3. int MyPlugin::add(int a , int b)  
  4. {  
  5.     return a+b ;  
  6. }  
  7.   
  8. #include "moc_MyPlugin.cpp"  


JSON文件 MyPlugin.json,本示例中该文件是空的。

工程文件 MyPlugin.pro

[cpp]  view plain  copy   Qt5的插件机制(7)--插件开发示例代码(Lower-level API) Qt5的插件机制(7)--插件开发示例代码(Lower-level API)
  1. TEMPLATE      = lib  
  2. CONFIG       += plugin console  
  3. QT           += core  
  4. HEADERS       = MyPlugin.h MyPluginInterface.h  
  5. SOURCES       = MyPlugin.cpp  
  6. OTHER_FILES   = MyPlugin.json  
  7. TARGET        = MyPlugin  
  8. DESTDIR       = ./  
  9. INCLUDEPATH  += ./  
  10. # install  
  11. target.path = ./install  
  12. INSTALLS += target  



应用程序代码

接口类头文件 MyPluginInterface.h,该文件与插件代码中的一致。

主程序文件 main.cpp

[cpp]  view plain  copy   Qt5的插件机制(7)--插件开发示例代码(Lower-level API) Qt5的插件机制(7)--插件开发示例代码(Lower-level API)
  1. #include "MyPluginInterface.h"  
  2. #include <QtPlugin>  
  3. #include <QApplication>  
  4. #include <QWidget>  
  5. #include <QPluginLoader>  
  6. #include <QString>   
  7. #include <QtDebug>  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.     QApplication app(argc, argv);  
  12.     QWidget w;  
  13.     QObject* object ;  
  14.     w.show();  
  15.       
  16.     app.addLibraryPath(QString("../MyPlugin/install")); // 添加库路径  
  17.     // 加载插件,取得实例  
  18.     QPluginLoader l(QString("MyPlugin")) ;  
  19.     //QPluginLoader l(QString("libMyPlugin.so")) ;  
  20.   
  21.     if ( (object=l.instance()) != NULL )  
  22.     {  
  23.         qDebug("plugin loaded .");  
  24.         // 使用插件  
  25.         int a = 14 , b = 23 ;  
  26.         MyPluginInterface* plugin = qobject_cast<MyPluginInterface*>(object) ;  
  27.         if (plugin)  
  28.             qDebug("%d + %d = %d",a,b,plugin->add(a,b));  
  29.     }  
  30.     else  
  31.     {  
  32.         qDebug("failed to load plugin !! ");  
  33.         QString errorStr = l.errorString();  
  34.         qDebug()<<errorStr;  
  35.     }  
  36.     return app.exec();  
  37. }  

MyApp.pro

[cpp]  view plain  copy   Qt5的插件机制(7)--插件开发示例代码(Lower-level API) Qt5的插件机制(7)--插件开发示例代码(Lower-level API)
  1. ######################################################################  
  2. # Automatically generated by qmake (3.0) ?? 11? 19 02:26:33 2014  
  3. ######################################################################  
  4.   
  5. TEMPLATE = app  
  6. QT += gui core widgets  
  7. CONFIG += console  
  8. TARGET = MyApp  
  9. INCLUDEPATH += .  
  10.   
  11. # Input  
  12. HEADERS += MyPluginInterface.h  
  13. SOURCES += main.cpp  


from: http://blog.csdn.net/newthinker_wei/article/details/41338447