【Qt】Qt Plugin:Qt插件创建与使用

来源:互联网 发布:淘宝代理 编辑:程序博客网 时间:2024/05/28 06:05

插件接口设计

以a+b=c的接口为例:int add(int a, int b)
在 主项目 工程中创建接口文件(一个头文件)eg:Add.h

#ifndef ADD_H#define ADD_H#include <QtPlugin>class Add{public:    virtual int add(int a, int b)=  0;//纯虚函数};Q_DECLARE_INTERFACE(Add, "org.qt-project.Qt.QGenericPluginFactoryInterface")#endif // ADD_H

使用插件接口

在项目中对插件接口的使用

    int a, b, eq;    QPluginLoader loader("D:/2-software/qt/qt5.6/5.6/mingw49_32/plugins/generic/plugin.dll");    if (loader.load())    {        qDebug()<<"loader load OK!";        QObject *obj = loader.instance();        if (obj)        {            qDebug()<<"obj OK! obj->metaObject()->className()=" << obj->metaObject()->className();            Add *plugin = dynamic_cast<Add*>(obj);            qDebug()<<"plugin = " << plugin;            if (plugin)            {                qDebug() << loader.metaData();                qDebug()<<"plugin OK!";                eq = plugin->add(a, b);            }            else            {                qDebug()<<"plugin error!";            }        }        else        {            qDebug()<<"obj error!";        }    }    else    {        qDebug()<<"loader load error!";    }

实现插件接口

新建插件工程

新建文件或项目–>选择Library–>C++库
这里写图片描述

选择库类型为:Qt Plugin

这里写图片描述

选择kit套件

这里写图片描述

选择基类QGenericPlugin

这里写图片描述

自动创建的文件列表

这里写图片描述

添加自己的接口

添加Add插件接口,将主项目中Add.h拷贝到插件项目中,修改GenericPlugin.h文件,GenericPlugin插件类继承QObject和插件接口类Add,并重新实现Add的add接口

GenericPlugin.h如下:

#include "Add.h"#include <QObject>class GenericPlugin :  public QObject, public Add{    Q_OBJECT#if QT_VERSION >= 0x050000    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QGenericPluginFactoryInterface" FILE "plugin.json")#endif // QT_VERSION >= 0x050000public:    GenericPlugin(QObject *parent = 0);    int add(int a, int b);};

GenericPlugin.cpp如下

#include "GenericPlugin.h"GenericPlugin::GenericPlugin(QObject *parent) :    QObject(parent){}int GenericPlugin::add(int a, int b){    return a+b;}#if QT_VERSION < 0x050000Q_EXPORT_PLUGIN2(plugin, GenericPlugin)#endif // QT_VERSION < 0x050000

参数传递

参数可以通过plugin.json中定义的键值对来传递,在主项目中可以通过,loader.metaData();接口来获取
plugin.json

{    "Keys" : [ 123123123]}

插件安装位置

插件默认安装qt的安装目录下qt\qt5.6\5.6\mingw49_32\plugins\generic中

pro文件

QT       += core guiTARGET = plugin //生成的插件名字TEMPLATE = lib  //插件也是库CONFIG += pluginDESTDIR = $$[QT_INSTALL_PLUGINS]/generic//插件安装位置SOURCES += GenericPlugin.cppHEADERS += GenericPlugin.h \    Add.hDISTFILES += plugin.jsonunix {    target.path = /usr/lib    INSTALLS += target}