QT插件简单使用2

news/2024/11/15 4:08:35/

目录

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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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 ;}elseqDebug()<<"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_OBJECTQ_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_OBJECTQ_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_OBJECTQ_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 运行结果


http://www.ppmy.cn/news/1387181.html

相关文章

【git】常用操作

基础操作 git init 初始化仓库 要使用 Git 进行版本管理&#xff0c;必须先初始化仓库&#xff0c; 执行了 git init命令的目录下就会生成 .git 目录。这个 .git 目录里存储着管理当前目录内容所需的仓库数据 git status 查看仓库状态 工作树和仓库在被操作的过程中&#xff0…

Android制作微信添加多个图片,放大图片

1.添加依赖 implementation com.github.bumptech.glide:glide:4.12.0 //裁剪图片等等 implementation androidx.recyclerview:recyclerview:1.1.0 //recycleview依赖 2.使用recycleview <androidx.recyclerview.widget.RecyclerViewandroid:id"id/recyclerView"…

【电路笔记】-MOSFET作为开关

MOSFET 作为开关 文章目录 MOSFET 作为开关1、概述2、MOSFET特性曲线2.1 截住区域2.2 饱和区域3、MOSFET作为开关的示例4、功率MOSFET电机控制5、P沟道MOSFET作为开关6、互补MOSFET作为开关电机控制器当 MOSFET 在截止区和饱和区之间工作时,MOSFET 是非常好的电子开关,用于控…

LeetCode——贪心算法(Java)

贪心算法 简介[简单] 455. 分发饼干[中等] 376. 摆动序列[中等] 53. 最大子数组和[中等] 122. 买卖股票的最佳时机 II[中等] 55. 跳跃游戏 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录的刷题路线。会附上一些个人的思路&#xff0c;如果有错误&#xf…

MQ组件之RabbitMQ学习

MQ组件之RabbitMQ入门 同步调用和异步调用 在微服务架构中&#xff0c;服务之间的调用有同步调用和异步调用两种方式。 我们使用OpenFeign去调用是同步调用&#xff0c;同步调用的缺点很明显&#xff0c;在下图的场景中&#xff0c;支付完成后需要调用订单服务、仓库服务、短…

吴恩达深度学习环境本地化构建wsl+docker+tensorflow+cuda

Tensorflow2 on wsl using cuda 动机环境选择安装步骤1. WSL安装2. docker安装2.1 配置Docker Desktop2.2 WSL上的docker使用2.3 Docker Destop的登陆2.4 测试一下 3. 在WSL上安装CUDA3.1 Software list needed3.2 [CUDA Support for WSL 2](https://docs.nvidia.com/cuda/wsl-…

数据结构与算法Bonus-KNN问题的代码求解过程

一、问题提出 &#xff08;一&#xff09;要求 1.随机生成>10万个三维点的点云&#xff0c;并以适当方式存储 2.自行实现一个KNN算法&#xff0c;对任意Query点&#xff0c;返回最邻近的K个点 3.不允许使用第三方库(e.g.flann&#xff0c;PCL,opencv)! 4.语言任选(推荐…

本地虚拟机平台Proxmox VE结合Cpolar内网穿透实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…