Qt使用Q_DECLARE_INTERFACE Q_INTERFACES宏实现接口类使用qobject_cast进行类型转换

QT插件机制中宏Q_PLUGIN_METADATA和Q_INTERFACES的作用 今天简单地了解了一下QT的插件机制,其实也没有什么可多说的,理论上说到底无非就是库的加载和函数地址的查找。但是QT对于插件机制的支持是建立在它独有的原对象系统基础之上,自然也有自己的一套插件实现规则,或者说是语法。 一般来讲,照着QT给的文档和DEMO,很容易就能实现一个插件,这里面最主要的就是三个宏: Q_DECLARE_INTERFACE Q_PLUGIN_METADATA Q_INTERFACES 那么,这三个宏到底在整个插件机制中到底起到一个以什么作用呢? Q_DECLAR... 阅读详情

在写抽象类或者接口的时候,不继承QObject, 但是又想使用qobject_cast进行类型转换,使用以下办法就能实现


#ifndef FACTORYINTERFACE_H__
#define FACTORYINTERFACE_H__
#include <QObject>
class FactoryInterface{
public:
	FactoryInterface() {};
	virtual ~FactoryInterface() {};

};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(FactoryInterface, "DetectionSoftware.Factory.FactoryInterface")//一定是唯一的标识符
QT_END_NAMESPACE

#endif // FACTORYINTERFACE_H__

/*
* 这个抽象类继承自FactoryInterface抽象类
* 
*/

#ifndef FACTORYINTERFACE1_0_H__
#define FACTORYINTERFACE1_0_H__
#include "FactoryInterface.h"

class FactoryInterface1_0: public  FactoryInterface{
public:
	FactoryInterface1_0() {};
	virtual ~FactoryInterface1_0() {};

signals:


public slots:


};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(FactoryInterface1_0, "DetectionSoftware.Factory.FactoryInterface1_0")//一定是唯一的标识符
QT_END_NAMESPACE
#endif // FACTORYINTERFACE1_0_H__

#ifndef FACTORYIMPLEMENT1_0_H__
#define FACTORYIMPLEMENT1_0_H__

#include <QObject>
#include "factoryInterface1_0.h"
class FactoryImplement1_0  : public QObject, public FactoryInterface1_0{
	Q_OBJECT
		Q_INTERFACES(FactoryInterface FactoryInterface1_0)

public:
	FactoryImplement1_0(QObject *parent = nullptr);
	~FactoryImplement1_0();
};


#endif // FACTORYIMPLEMENT1_0_H__

直接看代码,重点就是
Q_INTERFACES(FactoryInterface FactoryInterface1_0)
Q_DECLARE_INTERFACE(FactoryInterface1_0, “DetectionSoftware.Factory.FactoryInterface1_0”)//一定是唯一的标识符
这两个宏,具体作用不赘述。

然后使用

	QObject* test = new FactoryImplement1_0();
	FactoryInterface* t = qobject_cast<FactoryInterface*>(test);
	FactoryInterface1_0* tt = qobject_cast<FactoryInterface1_0*>(test);

注意
要想qobject_cast能用,实现类必须使用Q_INTERFACES指定转换的抽象类
只能从QObject类型转为Q_INTERFACES宏指定的抽象类

实战详细讲解Qt插件plugin的编写与用法 qt插件的开发,可以说是动态库的开发,因为调用方式类似,多熟悉一下,利用Qt框架开发很简单的。在想想这种调用过程有的熟悉,比如公司买了一堆摄像头,公司要对摄像头进行二次开发,实现自己想要的功能,集成到一套设备里去,然后在卖给用户。此时厂商肯定会提供开发文档,并给你SDK包(软件开发工具包), 包里你会发现只有头文件和一堆库文件,没有源文件,因为实现的过程是产商公司保密的,给你看还得了。所以都封装成了库的形式给你调用,如静态库或者动态库。 阅读详情

相关推荐

QT插件化开发实战:从接口定义到动态加载的完整指南

本文提供了QT插件化开发的完整实战指南,详细阐述了从核心接口设计到动态加载的实现流程。通过将应用程序功能模块化,开发者可以实现独立编译、按需组合与热插拔,从而显著提升大型QT项目的可维护性和扩展性。文中包含路径处理、插件管理器设计及常见错误排查等进阶技巧。

weixin_29200741的博客 413

Qt文档阅读笔记-Qt插件DECLARE_INTERFACE & METADATA & INTERFACES官方解析及实例

目录   官方解析 Q_DECLARE_INTERFACE Q_PLUGIN_METADATA Q_INTERFACES 博主栗子   官方解析 Q_DECLARE_INTERFACE 此宏用于把标识符与类名接口关联起来。这个标识符是唯一的,举个栗子: #define BrushInterface_iid "org.qt-project.Qt.Examples.Plug...

IT1995的博客 1万+

Qt插件开发避坑指南:从QGenericPlugin继承到QPluginLoader加载的5个常见错误

本文深入解析Qt插件开发中的5个常见错误,从QGenericPlugin继承到QPluginLoader加载的全流程问题,提供高效解决方案。涵盖元数据配置、构建系统设置、接口声明、对象生命周期管理和部署依赖等关键点,帮助开发者避开陷阱,提升插件开发效率。

weixin_30615767的博客 387

【Qt】Qt插件式开发中非常重要的3个宏——Q_DECLARE_INTERFACE、Q_PLUGIN_METADATA和Q_INTERFACES

在Qt插件式开发中,和这3个宏扮演者非常重要的角色,只要使用了Qt官方的插件式开发框架,就必定会使用到这三个宏。笔者对这3个宏总是混淆、记不清楚,今天就总结下来,方便日后查看。用于生命一个接口类型,以便插件能够实现这个接口。这个宏会生成用于接口类型可识别和查询的代码。这里进一步解释3个关键词,便于大家理解(或者以后的我~哈哈哈哈哈,忘的太快)接口类型:即下文示例中的类;识别:通过IID,即下文中的,在插件系统中唯一标识一个接口类型;查询:通过IID在插件系统中查找和加载一个实现了特定接口的插件。

油炸自行车的博客 1890

Qt插件机制的学习

 Mesh Deformer的架构若想参照OpenFlipper来实现,首先需要了解Qt plugin system的结构以及如何编写qt plugins.以下摘抄了Qt文档中的部分内容(只与自己想要实现的功能相关的内容)The Lower-Level API: Extending Qt ApplicationsNot only Qt itself but also Qt

jingwenlai_scut 1万+

QT5创建应用程序插件

主机环境:Windows XP

小人物专栏 5077

Qt插件开发

前言 插件是一种遵循一定规范的应用程序接口编写出来的程序,本教程说的插件是用于扩展Qt应用程序的插件,笔者做对创建和使用方法,做下简单的记录 一、Qt插件创建和使用流程 1.定义一个接口集(只有纯虚函数的类),用来与插件交流。 2.用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统。 3.应用程序中用QPluginLoader来加载插件。 4.用宏qobject_cast()来判断一个插件是否实现了接口。 二、定义接口文件 在QtCreator中,新建头文件 .

aggs1990的专栏 6009

Qt 插件定义

在头文件<QtPlugin>所以,在正式编写插件之前,很有必要先了解他们,一起来看看助手中的描述吧!版权声明:一去、二三里,未经博主允许不得转载。

青春不老,奋斗不止! 9741

qt插件元数据不包含一个有效的元数据_Qt5的插件机制(6)--开发Qt插件时几个重要的宏...

[插件代码接口类头文件 MyPluginInterface.h#ifndef INTERFACES_H#define INTERFACES_H#include #define QtPluginDemo_iid org.qt-project.Qt.PluginDemoclass MyPluginInt如何开发Qt插件,可以在Qt Assistant 中搜索"Qt Plugins"或"How to C...

weixin_39890102的博客 203

QT配置生成插件工程(1)

配置插件工程 步骤1 步骤2 3.插件部分宏含义: 1.通过插件使应用程序可扩展涉及以下步骤: ①定义一组用于与插件对话的接口(仅具有纯虚函数的类)。 ②使用Q_DECLARE_INTERFACE ()宏向Qt的元对象系统声明该接口。 ③在应用程序中使用QPluginLoader加载插件。 ④使用qobject_cast()测试插件是否实现了给定的接口。 4.编写一个插件的步骤: ①声明一个插件类,该类继承自QObject和该插件要提供的接口。 ②使用Q_INTERFACES ()宏告诉Qt的元对象系统有

xt18971492243的博客 375

VScode利用EIDE和cortex-debug进行stm32开发(也适用51)

你是否因为keil页面太丑而烦恼,你是否因为keil编译太慢而恼怒,ok阿,今天也是给大家带来怎么在vscode上进行stm32的编程(我不会告诉你,我搞了好几天才搞好的💔💔💔)为什么是简单介绍?因为太啰嗦了,我嫌麻烦😋,大家可以去EIDE的官方文档去看。

weixin_73952614的博客 9395

qt中charts的example中有哪些_Qt插件创建及加载

全网最详细的Qt插件搭建及加载步骤在开展新内容前,先简单回顾下上篇文章的内容。上次我们是直接在Qt 自带的例子基础上做的修改,直接运行。我们的插件需要继承Qt 的Style插件,之后重新实现自己想要实现的部分。在主程序中直接通过QApplication::setStyle进行调用。下面开展我们本次的内容,官方文档说明通过插件不仅可以扩展Qt本身,而且可以扩展Qt应用程序。 这要求应用程序使用QPl...

weixin_39735247的博客 192

反无人机作战体系全解析:从低慢小探测到分层拦截

随着小型无人机在军事和民用领域的广泛使用,低慢小目标探测与拦截成为低空安全的核心挑战。传统防空体系面对成本低廉、飞行高度低、雷达特征小的无人机集群时,暴露出探测难、识别难、处置成本失衡等问题。为应对威胁,反无人机体系采用分层闭环设计,融合雷达、光电、声学与无线电侦测实现多源感知,通过电子战软杀伤与导弹、高炮、激光等硬杀伤手段协同配合,并借助自动化指控系统缩短“传感器到射手”的响应时延。该体系既可支撑战场要地防护,也能为民用低空安防提供参考。围绕分层反制逻辑,梳理探测、软硬杀伤、指控布防及实战短板,提供理解反

weixin_42533120的博客 334

Qt框架中的插件机制

首先,需要在主程序中定义一个接口,这个接口规定了插件需要实现的方法。public:// 插件需要实现的功能Q_DECLARE_INTERFACE:通过这个宏,声明了插件接口的唯一标识符(IID)。这个标识符用于插件的注册和加载。定义插件接口:通过纯虚类定义插件的标准接口,并使用Q_DECLARE_INTERFACE宏注册接口标识符。实现插件:插件实现接口,并使用Q_PLUGIN_METADATA注册插件元数据,Q_EXPORT_PLUGIN2导出插件。

qq_43287763的博客 1599

【无人机对抗】基于matlab无人机红蓝对抗仿真【含Matlab源码 4436期】

无人机红蓝对抗仿真 完整代码,包运行;可提供运行操作视频!适合小白!

Matlab3024528700的博客 1380

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks6.9 + Workbench3.3的安装部署,以及简单示例项目的创建、编译和运行

Mr.Sugarcane 5466

Qt 之 qobject_cast 分析及QTBUG 20616

适用范围 qobject_cast 用于两种情况: QObject 及其派生类,且定义时使用了Q_OBJECTQ_DECLARE_INTERFACE 声明的接口类(不需要是QObject的派生类) 问题:如果既是QObject派生类,又用Q_DECLARE_INTERFACE声明为接口会怎么样?QTBUG 20616报告的就是这样一个问题。 QObject的派生类

yuzeze的专栏 752

Python爬取马蜂窝旅游攻略详细实战指南

马蜂窝是国内非常知名的旅游攻略网站,包含了大量的景点介绍、旅行攻略、游记等信息。爬取马蜂窝的数据对于旅游数据分析、旅游产品推荐等有重要价值。但由于马蜂窝对爬虫有一定的反爬措施,并且页面中大量内容通过JavaScript动态加载,爬虫难度相对较大。本篇博客将带你从零开始,使用Python和相关爬虫技术,逐步实现对马蜂窝旅游攻略内容的高效爬取。并结合实战经验,分析反爬策略,提供科学合理的绕过方案。本文介绍了马蜂窝攻略的结构和抓取难点。演示了静态+动态内容的混合爬取技术。介绍了多线程和异步加速方法。

2201_76125261的博客 588

Qt插件化(Plugins)开发扩展应用程序

前言 在前一篇文章中介绍了插件的定义及Qt中插件的基本概念,那么这里通过一个最简单的demo来对Qt插件开发有一定的了解。 Qt扩展应用程序 要想使用插件来扩展应用程序,那么首先在主程序中的步骤如下: 定义一组用于与插件通信的接口(只有纯虚函数的类) 使用 Q_DECLARE_INTERFACE() 宏来告诉 Qt 元对象系统有关接口的情况 在应用程序中使用 QPluginLoader 加载插件...

luoyayun361的专栏 1万+

如何利用通达信进行选股集合操作

每个交易者实际上都有自己的选股策略,这是必然的,也会有自己的主观干预,但是还是需要从客观热点股票进行一个比对的,才能说主观和客观相结合不至于​偏离方向。 这几天我也发了节前最后一天我的选股策略盘中的选择结果, 我也从网上拿到了热点股票池,当拿到之后你会发现如何从几十个股票热点股票选出核心票,这就是个问题了,这里面一定要通过股价涨跌幅来进行过滤,而不是通过指标,因为一切指标都是根据价格变化而改变的了,所以​这一步不要走弯路。 1、把拿到的热点股票名单,导入通达信自定义板块 2、删除

抢财猫股票课堂 2584

从零构建Fama-French多因子模型:量化投资系统开发实战

本文详细介绍了如何从零构建Fama-French多因子模型,并将其应用于量化投资系统的开发。首先,文章概述了Fama-French多因子模型的背景、核心原理和架构,解释了其如何通过引入市场风险、规模、价值、盈利和投资等因子来解释股票收益率的变化。接着,文章详细阐述了构建该模型的具体步骤,包括因子的计算、因子暴露的确定以及模型的估计。通过数学模型和公式,文章对模型进行了理论推导,并举例说明了其应用。此外,文章还提供了项目实战的代码案例,从开发环境搭建到源代码实现,逐步指导读者完成量化投资系统的开发。最后,文章

2501_92132293的博客 1226

Qt之插件

Qt之插件 No1.How to Create Qt Plugins 1、定义插件接口 2、使用Q_DECLARE_INTERFACE()宏 tell Qt’s meta-object system about the interface.Export the plugin using the Q_PLUGIN_METADATA() macro. 3、QPluginLoader加载插件 4、qobject_cast()测试接口实现 No2.How to Debug Plugins 环境变量中设置QT_DEB

Black_Silencer的博客 1897

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

Qt 插件的制作

简介 插件是一种遵循一定规范的应用程序接口编写出来的程序,定位于开发实现应用软件平台不具备的功能的程序。 插件API Qt提供了两种API用于创建插件:一种是高阶API,用于扩展Qt本身的功能,如自定义数据库驱动,图像格式,文本编码,自定义样式等;一种是低阶API,用于扩展Qt应用程序。 通过插件扩展应用程序功能 A、定义一个接口集(只有纯虚函数的类),用来与插件交流。 B、用宏Q_DECLARE...

weixin_42692504的博客 947

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

QPluginLoader加载插件失败问题(linux, windows均有效)

1. 出现 errorString :failed to extract plugin meta data from此问题 原因1: 接口实现类没有Q_OBJECT 原因2: 进行了Q_PLUGIN_METADATA的声明,但是json文件格式错误 2. 出现PluginLoader returns a QObject instance, but qobject_cast returns null (0x0)此问题 原因1: 接口文件不统一 Q_DECLARE_INTERFACE的id不...

cysssa的博客 8996

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Visual Studio 2022 配置“Debug|x64”的 Designtime 生成失败。IntelliSense 可能不可用。
下一篇: Qt 信号槽
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值