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
相关文章
-
无相关信息