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

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

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

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

效果:

QT QPluginLoader 插件开发 ui界面打包dll_第1张图片

 

 

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

QT QPluginLoader 插件开发 ui界面打包dll_第2张图片

 下一步后选择 Qt Plugin 开发

QT QPluginLoader 插件开发 ui界面打包dll_第3张图片

添加依赖库,在.pro里

QT QPluginLoader 插件开发 ui界面打包dll_第4张图片

 

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = lib

CONFIG += c++17

 删掉自带的全部文件

QT QPluginLoader 插件开发 ui界面打包dll_第5张图片

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

QT QPluginLoader 插件开发 ui界面打包dll_第6张图片

 QT QPluginLoader 插件开发 ui界面打包dll_第7张图片

 QT QPluginLoader 插件开发 ui界面打包dll_第8张图片

 QT QPluginLoader 插件开发 ui界面打包dll_第9张图片

 

#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

界面按照自己的需求写

QT QPluginLoader 插件开发 ui界面打包dll_第10张图片

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

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

再次添加一个AbstractPluginAPI.h 文件

QT QPluginLoader 插件开发 ui界面打包dll_第11张图片

 

接口类创建

继承上面定义的抽象类,实现抽象方法,方法的作用是实列化一个上面写的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

此时插件开发完成 

QT QPluginLoader 插件开发 ui界面打包dll_第12张图片

 QT QPluginLoader 插件开发 ui界面打包dll_第13张图片

 QT QPluginLoader 插件开发 ui界面打包dll_第14张图片

 

 使用插件:

 
#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]);

你可能感兴趣的:(QT,C++,python,qt,c++)