插件代码

接口类头文件 MyPluginInterface.h


[cpp] view plain copy 

  1. #ifndef INTERFACES_H  

  2. #define INTERFACES_H  

  3.   

  4. #include   

  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 

  1. #ifndef MYPLUGIN__H  

  2. #define MYPLUGIN__H  

  3.   

  4. #include   

  5. #include   

  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 

  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 

  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 

  1. #include "MyPluginInterface.h"  

  2. #include   

  3. #include   

  4. #include   

  5. #include   

  6. #include    

  7. #include   

  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(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()<

  35.     }  

  36.     return app.exec();  

  37. }  


MyApp.pro



[cpp] view plain copy 

  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