上位机图像处理和嵌入式模块部署(qt插件的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        一个软件一般有很多的功能,但是主流程只有一个。但在软件开发的过程当中,一般来说功能是需要不断添加的,但是主流程最好不要轻易修改。这里的插件就相当于各种各样的功能,而主流程就是如何怎么去调用这些插件的功能。所以,今天正好来学一下怎么添加qt插件,个人觉得这部分还是非常重要的。

1、创建一个qt widget项目

        首先,还是老规矩,创建一个qt widget项目,为后续测试打下基础。

2、再创建一个空项目

        这个空项目就是Qt Empty Application。目前vs开发的时候,没有发现专门处理qt插件的wizard,就用这个代替一下,也是可以的,只需要最后把生成目标修改成dll文件即可。

3、空项目中添加plugininterface.h文件

        首先,需要在空项目中添加一个plugininterface.h文件,这个相当于是一个抽象类,或者是接口。未来exe调用的时候,也要用这个h文件的。

// plugininterface.h
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H#include <QtPlugin>
class PluginInterface 
{
public:virtual ~PluginInterface() {}virtual QString getName() const = 0;virtual void performAction() = 0;
};Q_DECLARE_INTERFACE(PluginInterface, "com.example.PluginInterface")#endif // PLUGININTERFACE_H

4、空项目中添加MyPlugin类

        有了plugininterface.h之后,接下来就是需要创建一个MyPlugin类,实现plugininterface.h中虚函数的接口。其中MyPlugin.h内容如下,

// myplugin.h
#ifndef MYPLUGIN_H
#define MYPLUGIN_H#include "plugininterface.h"class MyPlugin : public QObject, public PluginInterface 
{Q_OBJECTQ_PLUGIN_METADATA(IID "com.example.PluginInterface" FILE "myplugin.json")Q_INTERFACES(PluginInterface)
public:MyPlugin();~MyPlugin();QString getName() const override;void performAction() override;
};#endif // MYPLUGIN_H

        头文件中还涉及到一个myplugin.json文件,在空项目的源代码同级目录下创建一下即可,内容就是一对空的花括号{}。接着,我们继续实现myplugin.cpp文件,

// myplugin.cpp
#include "myplugin.h"
#include <QDebug>MyPlugin::MyPlugin()
{return;
}MyPlugin::~MyPlugin()
{return;
}QString MyPlugin::getName() const {return "MyPlugin";
}void MyPlugin::performAction() {qDebug() << "MyPlugin performing action...";
}

        编译的时候,默认是生成exe文件的,这是不对的。我们可以选择右击项目,继续选择属性,在“常规”-》“项目默认值”的配置类型里面,把exe修改成dll,这样就可以了。这个dll就是我们最终需要的插件。

5、在exe程序中添加插件的调用代码

        插件生成好了,下面就是如何生成这个插件,这部分需要补充一下代码,

#include "QtWidgetsApplication.h"
#include "plugininterface.h"
#include <QtWidgets/QApplication>
#include <QDebug>
#include <QPluginLoader>int main(int argc, char *argv[])
{QApplication a(argc, argv);QPluginLoader loader("MyPlugin"); // Assuming the plugin library is named "myplugin"QObject *pluginInstance = loader.instance();if (pluginInstance) {PluginInterface *plugin = qobject_cast<PluginInterface*>(pluginInstance);if (plugin) {qDebug() << "Plugin loaded successfully!";qDebug() << "Plugin Name: " << plugin->getName();plugin->performAction();}else {qDebug() << "Failed to cast plugin instance to PluginInterface";}}else {qDebug() << "Failed to load the plugin.";}QtWidgetsApplication w;w.show();return a.exec();
}

        代码中MyPlugin就是生成的插件动态库MyPlugin.dll,而pluin->performAction()就是我们希望插件执行的动作。如果最终在输出窗口里面,我们看到了qDebug的相关打印,那么代表这个插件加载成功了,如下图所示,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/432963.html

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

相关文章

NiuShop开源商城系统 SQL注入漏洞复现

0x01 产品简介 Niushop商城系统,是由山西牛酷信息科技有限公司完全自主设计、研发的一套PHP的开源电商系统。Niushop商城系统为团队十年电商开发经验汇集巨献!是全国首创集 "B2B2C多用户商城 + 微信微分销 + 电商平台招商运营 + iOS 、Android多平台客户端" 的PHP开…

微软 AD |域控制器 | 组件 | 域服务 | 对象解析

介绍 Active Directory&#xff08;AD&#xff09;&#xff0c;是微软的目录服务&#xff0c;提供强大的功能和管理体系&#xff0c;用于组织管理和安全存储网络上的资源和用户、计算机、服务对象等信息。 AD 功能&#xff1a; 身份验证和访问控制&#xff1a; 提供集中式的身…

【Uni-App】Vuex在vue3版本中的使用与持久化

Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简而言之就是用来存数据&#xff0c;可以有效减少使用组件传参出现的问题。 基本元素&#xff1a;…

java servlet运输公司管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web运输公司管理系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

数据库设计的一些原则

文章目录 数据库设计原则表之间的关系一对一关系&#xff08;了解&#xff09;一对多&#xff08;多对一&#xff09;多对多联合主键和复合主键 数据库设计准则-范式1、函数依赖2、完全函数依赖3、部分函数依赖4、传递函数依赖5、码 第一范式第二范式第三范式第三范式 数据库设…

微服务-微服务Alibaba-Nacos注册中心实现

1. 系统架构的演变 俗话说&#xff0c; 没有最好的架构&#xff0c;只有最合适的架构。 微服务架构也是随着信息产业的发展而出现的最有普 遍适用性的一套架构模式。通常来说&#xff0c;我们认为架构发展历史经历了这样一个过程&#xff1a;单体架构——> 垂直架构 ——&g…

路飞项目--03

总页面 二次封装Response模块 # drf提供的Response&#xff0c;前端想接收到的格式 {code:xx,msg:xx} 后端返回&#xff0c;前端收到&#xff1a; APIResponse(tokneasdfa.asdfas.asdf)---->{code:100,msg:成功,token:asdfa.asdfas.asdf} APIResponse(code101,msg用户不存…

学习gin框架知识的注意点

这几天重新学习了一遍gin框架&#xff1a;收获颇多 Gin框架的初始化 有些项目中 初始化gin框架写的是&#xff1a; r : gin.New() r.Use(logger.GinLogger(), logger.GinRecovery(true)) 而不是r : gin.Default() 为什么呢&#xff1f; 点击进入Default源码发现其实他也是…

解读BEVFormer,新一代CV工作的基石

文章出处 BEVFormer这篇文章很有划时代的意义&#xff0c;改变了许多视觉领域工作的pipeline[2203.17270] BEVFormer: Learning Birds-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers (arxiv.org)https://arxiv.org/abs/2203.17270 BEV …

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

批量数据之DataX数据同步

文章目录 1 DataX1.1 引言1.2 DataX 简介1.3 核心1.3.1 DataX3.0 框架设计1.3.2 DataX3.0 核心架构 1.4 使用 DataX 实现数据同步1.4.1 准备安装1.4.2 Linux 上安装 DataX 软件1.4.3 DataX 基本使用1.4.4 MySQL 数据库1.4.4.1 安装1.4.4.2 准备同步1.4.4.3 创建存储过程&#x…

【日常学习笔记】gflags

https://mp.weixin.qq.com/s/FFdAUuQavhD5jCCY9aHBRg gflags定义的是全局变量&#xff0c;在main函数后&#xff0c;添加::gflags::ParseCommandLineFlags函数&#xff0c;就能解析命令行&#xff0c;在命令行传递定义的参数。 在程序中使用DEFINE_XXX函数定义的变量时&#x…