QT插件简单使用2

目录

[1 总的目录结构](#1 总的目录结构)

[2 主程序](#2 主程序)

[3 插件程序](#3 插件程序)

[4 运行结果](#4 运行结果)


相比原来的QT插件简单使用-CSDN博客增加了

复制代码
         QObject *create(const QString &name, const QString &spec) override;

函数的使用和Plugin.json的使用

1 总的目录结构

编译器mingw-64

2 主程序

1 新建一个其他项目的子文件目录后,创建一个普通的 QMainWindow 项目

主程序中添加头文件 Interface.h 内容如下:

cpp 复制代码
#ifndef INTERFACE_H
#define INTERFACE_H
#include <QGenericPlugin>
#include <QtPlugin>
//定义接口
class Interface : public QObject
{
    Q_OBJECT
public:
    virtual ~Interface() {}
    virtual int add(int a,int b) = 0;
};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(Interface, "org.qt-project.Qt.QGenericPluginFactoryInterface")
QT_END_NAMESPACE

#endif // INTERFACE_H

mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "interface.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void LoadPlugin();
    Interface* m_pInterface = nullptr;
private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
复制代码
mainwindow.cpp
cpp 复制代码
void MainWindow::LoadPlugin()
{
    QString filename = qApp->applicationDirPath() + "/Plugin.dll";
    qDebug()<<"LoadPlugin filename:"<<filename;
    QPluginLoader pluginLoader(filename);

    QGenericPlugin *plugin = qobject_cast<QGenericPlugin *>(pluginLoader.instance());
    if (plugin) {
        // 使用 QGenericPlugin 的 create 函数来创建插件对象
        QObject *pluginInstance = plugin->create("pluginA", "");
        if (pluginInstance){
            // 尝试转换插件对象为MyPlugin类型
            Interface *myPlugin = qobject_cast<Interface *>(pluginInstance);
            qDebug()<<"LoadPlugin success! "<<myPlugin->add(112,1);

            // 获取插件的元数据信息(如果有的话)
            QJsonObject metaData = pluginLoader.metaData();

            QJsonObject jsonObject = metaData.value("MetaData").toObject();
            QJsonObject obj = jsonObject.value("MetaData").toObject();
            QString version = obj.value("Version").toString();
            QString Name = obj.value("Name").toString();
            QString Description = obj.value("Description").toString();
            QString Class = obj.value("Class").toString();
            QString Author = obj.value("Author").toString();
            QString License = obj.value("License").toString();

            qDebug()<<version;
            qDebug()<<Name;
            qDebug()<<Description;
            qDebug()<<Class;
            qDebug()<<Author;
            qDebug()<<License;

            return ;
        }
        else
            qDebug()<<"qobject_cast fail!";
    }
    else{
        QMessageBox::warning(0,"warning","LoadPlugin fail!");
        qDebug()<<"LoadPlugin fail!";
    }


}
3 插件程序

1 右击主项目 新建子项目项

(也可以新建另一个工程 )

选择C++ Library ---->QT Plugin

将 Interface.h拷贝到该目录下 与Plugin.pro同级目录

复制代码
genericplugin.h
cpp 复制代码
#ifndef GENERICPLUGIN_H
#define GENERICPLUGIN_H

#include <QGenericPlugin>
#include "Interface.h"
class GenericPlugin : public QGenericPlugin
{
    Q_OBJECT

    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QGenericPluginFactoryInterface/1.0" FILE "Plugin.json")

public:
    explicit GenericPlugin(QObject *parent = nullptr);

private:
    QObject *create(const QString &name, const QString &spec) override;
};

#endif // GENERICPLUGIN_H
复制代码
genericplugin.cpp
cpp 复制代码
#include "genericplugin.h"
#include "plugina.h"
#include "pluginb.h"

GenericPlugin::GenericPlugin(QObject *parent)
    : QGenericPlugin(parent)
{

}


QObject *GenericPlugin::create(const QString &name, const QString &spec)
{
    static_assert(true, "You need to implement this function");
    if(name == "pluginA")
        return new pluginA();
    if(name == "pluginB")
        return new pluginB();
    return nullptr;
}

plugina.h

cpp 复制代码
#ifndef PLUGINA_H
#define PLUGINA_H

#include <QObject>
#include "Interface.h"
class pluginA : public Interface
{

    Q_OBJECT
    Q_INTERFACES(Interface)
public:
    pluginA();
    int add(int a,int b) override;
};

#endif // PLUGINA_H

plugina.cpp

cpp 复制代码
#include "plugina.h"

pluginA::pluginA()
{

}

int pluginA::add(int a, int b)
{
    return 11;
}

pluginb.h

cpp 复制代码
#ifndef PLUGINB_H
#define PLUGINB_H

#include <QObject>
#include "Interface.h"
class pluginB : public Interface
{

    Q_OBJECT
    Q_INTERFACES(Interface)
public:
    pluginB();
    int add(int a,int b) override;
};

#endif // PLUGINB_H

pluginb.cpp

cpp 复制代码
#include "pluginb.h"

pluginB::pluginB()
{

}

int pluginB::add(int a, int b)
{
    return 12;
}

Plugin.json

cpp 复制代码
{
    "MetaData": {
        "Version": "1.0.0",
        "Name": "MyCustomPlugin",
        "Description": "A custom plugin for my application",
        "Class": "MyCustomPluginClass",
        "Author": "Your Name",
        "License": "Some License",
        "Dependencies": {
            "OtherPlugin": ">=1.2.0"
        }
    }
}
4 运行结果
相关推荐
AI视觉网奇16 分钟前
动作识别 视频理解大模型
开发语言·python·音视频
SomeB1oody42 分钟前
【RustyML入门】3.8. 正则化与归一化层
开发语言·后端·机器学习·rust·教程
__zRainy__1 小时前
Node系列 · Node基础:全局变量与全局对象
开发语言·前端·javascript
鬼手点金1 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
Mr. zhihao1 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
格林威2 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
djjjx.2 小时前
【 C++ 】多态
开发语言·c++·多态
夜雪一千2 小时前
Python如何使用XPath定位没有特征的元素?无id、无class通用定位技巧
开发语言·python
艾莉丝努力练剑2 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
流浪0012 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·python