热门IT资讯网

QT插件

发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,插件代码接口类头文件 MyPluginInterface.h[cpp] view plain copy #ifndef INTERFACES_H#define INTERFACES_H#include

插件代码

接口类头文件 MyPluginInterface.h


[cpp] view plain copy

  1. #ifndef INTERFACES_H

  2. #define INTERFACES_H

  3. #include

  4. #define QtPluginDemo_iid "org.qt-project.Qt.PluginDemo"

  5. class MyPluginInterface

  6. {

  7. public:

  8. virtual int add(int,int) = 0 ; // 正确写法

  9. // virtual int add(int,int); // 不太妥的写法(虽然这也是正确的虚函数声明语句)

  10. // 注:接口类中的虚函数都应有实体,或设置为0(推荐),这样

  11. // C++的编译器才能为接口类生成虚函数表。否则,如果没有实现

  12. // 接口类的虚函数也没有将其设为0,程序在在链接时可能会失败,

  13. // 或者链接成功但最后生成的库无法加载(库中有未定义的符号)

  14. };

  15. Q_DECLARE_INTERFACE ( MyPluginInterface, QtPluginDemo_iid ) ;

  16. #endif


插件头文件 MyPlugin.h


[cpp] view plain copy

  1. #ifndef MYPLUGIN__H

  2. #define MYPLUGIN__H

  3. #include

  4. #include

  5. #include "MyPluginInterface.h"

  6. class MyPlugin : public QObject, public MyPluginInterface

  7. {

  8. Q_OBJECT

  9. Q_PLUGIN_METADATA ( IID QtPluginDemo_iid FILE "MyPlugin.json")

  10. Q_INTERFACES(MyPluginInterface)

  11. public:

  12. int add(int,int);

  13. };

  14. #endif


插件源文件 MyPlugin.cpp



[cpp] view plain copy

  1. #include "MyPlugin.h"

  2. int MyPlugin::add(int a , int b)

  3. {

  4. return a+b ;

  5. }

  6. #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. int main(int argc, char *argv[])

  9. {

  10. QApplication app(argc, argv);

  11. QWidget w;

  12. QObject* object ;

  13. w.show();

  14. app.addLibraryPath(QString("../MyPlugin/install")); // 添加库路径

  15. // 加载插件,取得实例

  16. QPluginLoader l(QString("MyPlugin")) ;

  17. //QPluginLoader l(QString("libMyPlugin.so")) ;

  18. if ( (object=l.instance()) != NULL )

  19. {

  20. qDebug("plugin loaded .");

  21. // 使用插件

  22. int a = 14 , b = 23 ;

  23. MyPluginInterface* plugin = qobject_cast(object) ;

  24. if (plugin)

  25. qDebug("%d + %d = %d",a,b,plugin->add(a,b));

  26. }

  27. else

  28. {

  29. qDebug("failed to load plugin !! ");

  30. QString errorStr = l.errorString();

  31. qDebug()<

  32. }

  33. return app.exec();

  34. }


MyApp.pro



[cpp] view plain copy

  1. ######################################################################

  2. # Automatically generated by qmake (3.0) ?? 11? 19 02:26:33 2014

  3. ######################################################################

  4. TEMPLATE = app

  5. QT += gui core widgets

  6. CONFIG += console

  7. TARGET = MyApp

  8. INCLUDEPATH += .

  9. # Input

  10. HEADERS += MyPluginInterface.h

  11. SOURCES += main.cpp


0