素材巴巴 > 程序开发 >

QT QPluginLoader 插件开发 ui界面打包dll

程序开发 2023-09-03 12:13:56

 将项目模块化,每一个模块单独开发,模块的组成形成最终的主程序,

点击左侧按钮就会弹出对应的插件应用,每一个子窗口都是单独的dll 插件,

灵活,升级,下载,卸载。

效果:

 

 

打开QT Creator 新建插件开发项目

 下一步后选择 Qt Plugin 开发

添加依赖库,在.pro里

 

QT       += core gui
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTEMPLATE = libCONFIG += c++17
 

 删掉自带的全部文件

 新建 AbstractPlugin.h  抽象接口类, 带Ui 界面的插件接口

 

 

 

 

#ifndef ABSTRACTPLUGIN_H
 #define ABSTRACTPLUGIN_H#include class QWidget;class AbstractPlugin {
 public:virtual ~AbstractPlugin() = default;virtual QWidget *newObject() = 0;
 };
 // id 可以自己按照项目定义
 #define AbstractInterface_iid "com.Plugin.AbstractPlugin"Q_DECLARE_INTERFACE(AbstractPlugin, AbstractInterface_iid)
 #endif // ABSTRACTPLUGIN_H
 

新建ui界面  右击项目。Add new

界面按照自己的需求写

 实现抽象接口。继承上面定义的抽象类,实现抽象方法,

方法的作用是实列化一个上面写的ui对象并返回

再次添加一个AbstractPluginAPI.h 文件

 

接口类创建

继承上面定义的抽象类,实现抽象方法,方法的作用是实列化一个上面写的ui对象并返回

#ifndef ABSTRACTPLUGINAPI_H
 #define ABSTRACTPLUGINAPI_H
 #include "AbstractPlugin.h"
 #include "mainwindow.h"
 // 继承抽象类
 class AbstractPluginAPI : public QObject , AbstractPlugin
 {Q_OBJECT// 这里 AbstractPluginAPI.json 文件用于描述 此插件的信息Q_PLUGIN_METADATA(IID "com.Plugin.AbstractPlugin" FILE "AbstractPluginAPI.json")Q_INTERFACES(AbstractPlugin)
 public:explicit AbstractPluginAPI (QObject  *parent = nullptr) : QObject (parent){}QWidget *newObject() override {// 实现抽象方法// 这里是创建一个对象返回,并非返回对象本身。属于多列不是单列插件对象return new MainWindow();}
 };
 #endif // ABSTRACTPLUGINAPI_H
 

最后添加一个用于描述插件信息的json 文件 ,点击编译生成dll

此时插件开发完成 

 

 

 

 使用插件:

 
 #include 
 #include "AbstractPlugin.h"// 抽象接口文件
 #include 
 #include
 #include
 int main(int argc, char *argv[])
 {QApplication a(argc, argv);QPluginLoader loader("untitled.dll");loader.load();// 获取插件json文件信息qDebug() << loader.metaData();QObject  *plugin = loader.instance();// 实例化AbstractPlugin * pinterface = qobject_cast(plugin);QWidget *p = pinterface->newObject();// 调用实现的抽象方法,实列一个对象QWidget *p1 = pinterface->newObject();p->show();p1->show();return a.exec();
 }

在目前的Qt 版本中,一旦加载了插件,卸载后插件一直未得到正真的释放,所以无法对插件文件进行删除,但是可以将插件文件改名。去除.dll的后缀 在程序每次运行的时候,自动删除不是.dll的文件,即可。

插件的卸载。和删除插件dll 文件,

QStrin PluginPath = loader.fileName();// 获取插件所在的绝对路径位置
 loader.unload();// 卸载插件
 // 将插件改名,以.分割 不要后缀.dll
 QFile::rename(PluginPath , PluginPath.split(".")[0]);
 


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。