QT插件简单使用2

目录

1 总的目录结构

2 主程序

3 插件程序

4 运行结果


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

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

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

1 总的目录结构

        编译器mingw-64

2 主程序

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

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

#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

#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
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
#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
#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

#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

#include "plugina.h"

pluginA::pluginA()
{

}

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

pluginb.h

#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

#include "pluginb.h"

pluginB::pluginB()
{

}

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

Plugin.json

{
    "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 运行结果

相关推荐

  1. Qt

    2024-03-18 18:40:05       20 阅读
  2. Qt 框架

    2024-03-18 18:40:05       7 阅读
  3. Qt开发与QPluginLoader的使用

    2024-03-18 18:40:05       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 18:40:05       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 18:40:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 18:40:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 18:40:05       18 阅读

热门阅读

  1. 蓝桥杯每日一题(BFS)

    2024-03-18 18:40:05       17 阅读
  2. 阿里巴巴中国站获得1688商品详情 API

    2024-03-18 18:40:05       19 阅读
  3. C语言向C++过渡的基础知识(二)

    2024-03-18 18:40:05       17 阅读
  4. 阐述Dubbo的并发控制原理

    2024-03-18 18:40:05       16 阅读
  5. 程序员应该如何选择职业赛道?

    2024-03-18 18:40:05       17 阅读
  6. 鸿蒙内核系统

    2024-03-18 18:40:05       19 阅读
  7. 5.66 BCC工具之offwaketime.py解读

    2024-03-18 18:40:05       15 阅读