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

在写抽象类或者接口的时候,肯定是不能继承QObject的

但是又想使用qobject_cast进行类型转换,使用以下办法就能实现

cpp 复制代码
#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__
cpp 复制代码
/*
* 这个抽象类继承自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__
cpp 复制代码
#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")//一定是唯一的标识符

这两个宏,具体作用不赘述。

然后使用

cpp 复制代码
	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宏指定的抽象类

相关推荐
jvvz afqh3 分钟前
mysql用户名怎么看
数据库·mysql
格林威4 分钟前
工业视觉检测:两大主流异常检测开源框架深度对比(PatchCore vs SPADE)
开发语言·人工智能·深度学习·数码相机·计算机视觉·视觉检测·工业相机
eDEs OLDE7 分钟前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
EXnf1SbYK7 分钟前
Redis分布式锁进阶第八篇:锁超时乱序深度踩坑 + 看门狗失效真实溯源 + 业务长耗时标准化兜底方案
数据库·redis·分布式
2zcode9 分钟前
基于Matlab元胞自动机模拟(CA)静态再结晶过程
开发语言·matlab·静态再结晶
研究点啥好呢13 分钟前
滴滴Go后端开发工程师面试题精选:10道高频考题+答案解析
java·开发语言·golang
Levin__NLP_CV_AIGC14 分钟前
py文件中文件复制方法
开发语言·python
EXnf1SbYK17 分钟前
Redis分布式锁进阶第十一篇
数据库·redis·分布式
yong999019 分钟前
EKF-SLAM在MATLAB上的仿真实现
开发语言·matlab
广州山泉婚姻22 分钟前
C语言三种基本程序结构详解
c语言·开发语言