一、一些概念
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_OBJECTQ_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
夜雨聆风