接口类头文件 MyPluginInterface.h
#ifndef INTERFACES_H #define INTERFACES_H #include <QtPlugin> #define QtPluginDemo_iid "org.qt-project.Qt.PluginDemo" class MyPluginInterface { public: virtual int add(int,int) = 0 ; // 正确写法 // virtual int add(int,int); // 不太妥的写法(虽然这也是正确的虚函数声明语句) // 注:接口类中的虚函数都应有实体,或设置为0(推荐),这样 // C++的编译器才能为接口类生成虚函数表。否则,如果没有实现 // 接口类的虚函数也没有将其设为0,程序在在链接时可能会失败, // 或者链接成功但最后生成的库无法加载(库中有未定义的符号) }; Q_DECLARE_INTERFACE ( MyPluginInterface, QtPluginDemo_iid ) ; #endif
插件头文件 MyPlugin.h
#ifndef MYPLUGIN__H #define MYPLUGIN__H #include <QObject> #include <QDebug> #include "MyPluginInterface.h" class MyPlugin : public QObject, public MyPluginInterface { Q_OBJECT Q_PLUGIN_METADATA ( IID QtPluginDemo_iid FILE "MyPlugin.json") Q_INTERFACES(MyPluginInterface) public: int add(int,int); }; #endif
#include "MyPlugin.h" int MyPlugin::add(int a , int b) { return a+b ; } #include "moc_MyPlugin.cpp"
JSON文件 MyPlugin.json,本示例中该文件是空的。
工程文件 MyPlugin.pro
TEMPLATE = lib CONFIG += plugin console QT += core HEADERS = MyPlugin.h MyPluginInterface.h SOURCES = MyPlugin.cpp OTHER_FILES = MyPlugin.json TARGET = MyPlugin DESTDIR = ./ INCLUDEPATH += ./ # install target.path = ./install INSTALLS += target
接口类头文件 MyPluginInterface.h,该文件与插件代码中的一致。
主程序文件 main.cpp
#include "MyPluginInterface.h" #include <QtPlugin> #include <QApplication> #include <QWidget> #include <QPluginLoader> #include <QString> #include <QtDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget w; QObject* object ; w.show(); app.addLibraryPath(QString("../MyPlugin/install")); // 添加库路径 // 加载插件,取得实例 QPluginLoader l(QString("MyPlugin")) ; //QPluginLoader l(QString("libMyPlugin.so")) ; if ( (object=l.instance()) != NULL ) { qDebug("plugin loaded ."); // 使用插件 int a = 14 , b = 23 ; MyPluginInterface* plugin = qobject_cast<MyPluginInterface*>(object) ; if (plugin) qDebug("%d + %d = %d",a,b,plugin->add(a,b)); } else { qDebug("failed to load plugin !! "); QString errorStr = l.errorString(); qDebug()<<errorStr; } return app.exec(); }
###################################################################### # Automatically generated by qmake (3.0) ?? 11? 19 02:26:33 2014 ###################################################################### TEMPLATE = app QT += gui core widgets CONFIG += console TARGET = MyApp INCLUDEPATH += . # Input HEADERS += MyPluginInterface.h SOURCES += main.cpp