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

插件接口设计

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

#ifndef ADD_H
#define ADD_H

#include 
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(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】Qt Plugin:Qt插件创建与使用_第1张图片

选择库类型为:Qt Plugin

【Qt】Qt Plugin:Qt插件创建与使用_第2张图片

选择kit套件

【Qt】Qt Plugin:Qt插件创建与使用_第3张图片

选择基类QGenericPlugin

【Qt】Qt Plugin:Qt插件创建与使用_第4张图片

自动创建的文件列表

【Qt】Qt Plugin:Qt插件创建与使用_第5张图片

添加自己的接口

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

GenericPlugin.h如下:

#include "Add.h"
#include 
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 >= 0x050000

public:
    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 < 0x050000
Q_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 gui

TARGET = plugin //生成的插件名字
TEMPLATE = lib  //插件也是库
CONFIG += plugin

DESTDIR = $$[QT_INSTALL_PLUGINS]/generic//插件安装位置

SOURCES += GenericPlugin.cpp

HEADERS += GenericPlugin.h \
    Add.h
DISTFILES += plugin.json

unix {
    target.path = /usr/lib
    INSTALLS += target
}

你可能感兴趣的:(Qt)