将项目模块化,每一个模块单独开发,模块的组成形成最终的主程序,
点击左侧按钮就会弹出对应的插件应用,每一个子窗口都是单独的dll 插件,
灵活,升级,下载,卸载。
效果:
文章来源:https://www.toymoban.com/news/detail-666320.html
打开QT Creator 新建插件开发项目
下一步后选择 Qt Plugin 开发
添加依赖库,在.pro里
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TEMPLATE = lib
CONFIG += c++17
删掉自带的全部文件
新建 AbstractPlugin.h 抽象接口类, 带Ui 界面的插件接口
#ifndef ABSTRACTPLUGIN_H
#define ABSTRACTPLUGIN_H
#include <QObject>
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 <QApplication>
#include "AbstractPlugin.h"// 抽象接口文件
#include <QPluginLoader>
#include<QWidget>
#include<QDebug>
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<AbstractPlugin *>(plugin);
QWidget *p = pinterface->newObject();// 调用实现的抽象方法,实列一个对象
QWidget *p1 = pinterface->newObject();
p->show();
p1->show();
return a.exec();
}
在目前的Qt 版本中,一旦加载了插件,卸载后插件一直未得到正真的释放,所以无法对插件文件进行删除,但是可以将插件文件改名。去除.dll的后缀 在程序每次运行的时候,自动删除不是.dll的文件,即可。文章来源地址https://www.toymoban.com/news/detail-666320.html
插件的卸载。和删除插件dll 文件,
QStrin PluginPath = loader.fileName();// 获取插件所在的绝对路径位置
loader.unload();// 卸载插件
// 将插件改名,以.分割 不要后缀.dll
QFile::rename(PluginPath , PluginPath.split(".")[0]);
到了这里,关于QT QPluginLoader 插件开发 ui界面打包dll的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!