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宏指定的抽象类

相关推荐
想摆烂的不会研究的研究生1 分钟前
MySQL海量数据深分页优化
数据库·redis·后端·mysql·缓存
廋到被风吹走2 分钟前
【数据库】【Mysql】MySQL 索引优化深度解析:从原理到实战
数据库·mysql·adb
刘一说3 分钟前
Java语言多态特性在Spring Boot中的体现:从原理到实战
java·开发语言·spring boot
霖霖总总3 分钟前
[小技巧32]深入理解 MySQL中的双1参数:innodb_flush_log_at_trx_commit 与 sync_binlog
运维·数据库·mysql
郑州光合科技余经理8 分钟前
同城O2O系统架构解析:中台化如何赋能本地生活服务
java·开发语言·javascript·人工智能·系统架构·php·生活
期待のcode11 分钟前
垃圾回收的停顿
java·开发语言·jvm
高-老师12 分钟前
基于R语言生物信息学大数据分析与绘图实践技术应用
开发语言·数据分析·r语言·生物信息
枫叶丹413 分钟前
国产数据库新标杆:金仓以多模融合重构文档数据库未来
开发语言·数据库·重构
JasmineWr16 分钟前
Spring项目启动初始化方案
开发语言·spring
郑州光合科技余经理19 分钟前
中台架构实战:同城O2O系统二次开发与部署指南
java·大数据·开发语言·前端·后端·架构·php