乐于分享
好东西不私藏

Qt插件

Qt插件

一、一些概念

1.Qt插件是Qt框架实现模块化、可扩展、热插拔的核心机制,分为扩展Qt自身高阶API(如数据库驱动、图片格式)和扩展应用程序低阶API(自定义业务插件)两大类,基于元对象系统 + 动态库实现。说白了就是Qt插件本质就是标准动态库,只是遵守Qt专属导出规则;

2.Qt插件的意义:

--解耦拆分,代码不乱;

  --动态扩展,不用重新编译主程序;

  --按需加载,省内存、提速;

  --权限隔离、安全可控;

  --跨项目复用、统一架构。

3.关键宏与类

 --Q_DECLARE_INTERFACE(Interface, IID):向元对象系统注册接口(必须全局唯一);

  --Q_INTERFACES(Interface):在插件类中声明实现的接口;

  --Q_PLUGIN_METADATA(IID "..." FILE "plugin.txt"):导出插件元数据;

  --QPluginLoader:主程序加载插件、获取实例;

  --qobject_cast<Interface*>(pluginInstance):安全转换为接口指针(失败返回nullptr)。

二、插件开发具体步骤(低阶自定义业务插件)

1.定义接口(主程序与插件公共头文件):主程序和插件约定好要实现什么功能;

2.写插件(实现接口):插件类必须继承QObject + 接口;

3.主程序加载插件。

三、测试

1.工程

1)插件工程(C++库工程)

 --IBusinessPlugin.h 

  --businessPlugin.h

  --businessPlugin.cpp

  --最后会生成businessPlugin.dll(插件)

2)测试插件工程(控制台工程)

main.cpp

2.源码

IBusinessPlugin.h 

#ifndef IBUSINESSPLUGIN_H#define IBUSINESSPLUGIN_H#include<QObject>class IBusinessPlugin{public:    virtual ~IBusinessPlugin() {}    virtual QString getPluginName()0;    virtualvoidexecuteTask(const QString &task)0;};#define IBusinessPlugin_IID "com.example.IBusinessPlugin/1.0"Q_DECLARE_INTERFACE(IBusinessPlugin, IBusinessPlugin_IID)#endif// IBUSINESSPLUGIN_H

businessPlugin.h

#ifndef BUSINESSPLUGIN_H#define BUSINESSPLUGIN_H#include<QObject>#include"IBusinessPlugin.h"class BusinessPlugin : public QObject, public IBusinessPlugin{    Q_OBJECT    Q_INTERFACES(IBusinessPlugin)    Q_PLUGIN_METADATA(IID IBusinessPlugin_IID)public:    explicit BusinessPlugin(QObject *parent = nullptr);    QString getPluginName()override;    voidexecuteTask(const QString &task)override;};#endif// BUSINESSPLUGIN_H

businessPlugin.cpp

#include"businessplugin.h"#include<QDebug>BusinessPlugin::BusinessPlugin(QObject *parent)    : QObject(parent){}QString BusinessPlugin::getPluginName(){    return "业务处理插件";}voidBusinessPlugin::executeTask(const QString &task){    qDebug() << "[插件] 执行任务:" << task;}

main.cpp

#include<QCoreApplication>#include<QPluginLoader>#include<QDebug>#include"pluginInterface.h"intmain(int argc, char *argv[]){    QCoreApplication a(argc, argv);    QPluginLoader loader("./plugins/businessPlugin.dll")//插件所在路径    if (auto obj = loader.instance()) {        auto plugin = qobject_cast<IBusinessPlugin*>(obj);        if (plugin) {            qDebug() << "加载成功:" << plugin->getPluginName();            plugin->executeTask("test");        }    }    else    {        qDebug() << "插件路径错误";    }    return a.exec();}

3.程序执行结果

四、开发工具及Qt版本

开发工具:Qt Creator 4.10.2

Qt版本:Qt_5_12_6