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 运行结果
相关推荐
gregmankiw2 分钟前
C#调用Rust动态链接库DLL的案例
开发语言·rust·c#
roman_日积跬步-终至千里17 分钟前
【Go语言基础【20】】Go的包与工程
开发语言·后端·golang
秦少游在淮海37 分钟前
C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
开发语言·c++·stl·string·范围for·auto·string 的使用
AAA废品回收站陈师傅43 分钟前
68常用控件_QGroupBox的使用
qt
const5441 小时前
cpp自学 day2(—>运算符)
开发语言·c++
心扬1 小时前
python生成器
开发语言·python
明月醉窗台1 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
阿蒙Amon1 小时前
06. C#入门系列【自定义类型】:从青铜到王者的进阶之路
开发语言·c#
虾球xz1 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习
沉到海底去吧Go1 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名