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]);
 标签:
                            上一篇:
                             Angular4环境安装
                                                        下一篇:
                            
                            ROS通信实操(小乌龟通信实现)(九)C  、Python
                                                    
                        相关文章
- 
                    			无相关信息                            
