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_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.rhkb.cn/news/278280.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

onnx 格式模型可视化工具

onnx 格式模型可视化工具 0. 引言1. 可视化工具2. 安装 Netron: Viewer for ONNX models 0. 引言 ONNX 是一种开放格式&#xff0c;用于表示机器学习模型。ONNX 定义了一组通用运算符&#xff08;机器学习和深度学习模型的构建基块&#xff09;和通用文件格式&#xff0c;使 A…

Selenium-webdriver_manager判断是否已经下载过驱动(复用缓存驱动)

1,谷歌浏览器默认位置 2&#xff0c;ChromeDriverManager 下载的驱动位置 其中admin为机器的用户名 def installDriver(self):"""判断是否需要下载driver""""""找到本机谷歌浏览器版本""""""C:\P…

Unity触发器的使用

1.首先建立两个静态精灵&#xff08;并给其中一个物体添加"jj"标签&#xff09; 2.添加触发器 3.给其中一个物体添加刚体组件&#xff08;如果这里是静态的碰撞的时候将不会触发效果&#xff0c;如果另一个物体有刚体可以将它移除&#xff0c;或者将它的刚体属性设置…

做一个个人网站分几步?第一步,找个简单的模板借鉴(抄)一下

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

Css提高——flex布局及其相关属性

目录&#xff1a; 1、传统布局与flex布局的区别 2、flex的布局原理 3、flex常见的父项属性 3.1、flex-direction &#xff1a;设置主轴的方向 3.2、justify-content 设置主轴上的子元素排列方式 3.3、flex-wrap 设置子元素是否换行 3.4、align-items 设置侧轴上的子元素排…

【周总结】✈️✈️✈️

周总结 完成时区改造的开发 完成已提测功能的问题修改 2024/3/17 阴 不冷不热 Spring is coming soon. Its an uneasy weekend to enjoy by myself,because all things what i wanna do is made by self,(when getting up,what to eat,when to sleep...) There …

SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法

问题&#xff1a; java: 无法访问org.mybatis.spring.annotation.MapperScan 错误的类文件: /D:/Program Files/apache-maven-3.6.0/repository/org/mybatis/mybatis-spring/3.0.3/mybatis-spring-3.0.3.jar!/org/mybatis/spring/annotation/MapperScan.class 类文件具有错误的…

AI预测福彩3D第12弹【2024年3月18日预测--新算法重新开始计算第9次测试】

今天继续对第一套算法进行测试。废话不多说了&#xff0c;直接上分析出的图表&#xff0c;再上结果。 最终&#xff0c;经过研判分析&#xff0c;2024年3月18日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;3 2 4 0 1 5 8(6或9换8&#xff0c;重点考虑6) 十位&#x…

【C语言】linux内核软中断

一、什么是软中断&#xff1f; 内核中的软中断&#xff08;Softirqs&#xff09;和任务下半部&#xff08;Tasklets&#xff09;是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程&#xff08;ISR&#xff09;中执行耗时操作或…

服务器数据恢复—raid5热备盘上线同步数据失败的如何恢复数据

服务器数据恢复环境&故障&分析&#xff1a; 一台存储上有一组由多块硬盘组建的raid5阵列&#xff0c;该raid5阵列中的一块硬盘掉线&#xff0c;热备盘自动上线同步数据的过程中&#xff0c;raid阵列中又有一块硬盘掉线&#xff0c;热备盘的数据同步被中断&#xff0c;r…

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…

腾讯云优惠券领取的几种方法,助你降低云服务成本

随着云计算技术的广泛应用&#xff0c;越来越多的企业和个人选择使用云服务来降低运营成本、提高运营效率。腾讯云作为国内领先的云服务提供商&#xff0c;凭借其出色的性能、稳定性和安全性&#xff0c;赢得了广大用户的信赖。为了回馈用户&#xff0c;腾讯云经常推出各种优惠…

Python实现BOA蝴蝶优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

element el-cascader获取完整数据

<el-table-column prop"createTime" label"编辑店铺分类"><template slot-scope"scope"><el-cascaderref"cascader"v-model"scope.row.shoptypeone":options"commoditylist"placeholder"请选…

RPC 和 序列化

RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口&#xff0c; 包含kvserver功能的一对一映射&#xff1a;Get/PutAppend&#xff0c;通过stub对象——raftKVRpcProctoc:…

爬虫神器!使用Python一键下载网页图片,省时高效!

引言 爬虫技术在当今信息时代中扮演着重要的角色&#xff0c;可以自动化获取互联网上的数据。本教程将围绕你提供的Python爬虫代码展开&#xff0c;旨在实现自动下载图片的功能。通过这个示例&#xff0c;你将学习如何利用爬虫技术批量获取网页中的图片&#xff0c;并将其保存…

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

odoo17开发教程(14):Computed Fields And Onchanges

目录 概述&#xff1a; 计算字段Computed Fields 依赖关系 实践&#xff1a; 计算总面积 计算最佳报价。 Inverse Function反函数 实践&#xff1a;计算报价的有效日期。 其他信息 Onchanges 实践&#xff1a;设置花园面积和方向值。 如何使用它们&#xff1f; 概述…

漫谈5种注册中心

01 注册中心基本概念 1.1 什么是注册中心&#xff1f; 注册中心主要有三种角色&#xff1a; 服务提供者&#xff08;RPC Server&#xff09;&#xff1a;在启动时&#xff0c;向 Registry 注册自身服务&#xff0c;并向 Registry 定期发送心跳汇报存活状态。 服务消费者&…