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

相关推荐
Flying pigs~~5 分钟前
数据分析三剑客之Pandas
大数据·数据库·人工智能·数据分析·numpy·pandas
tod11320 分钟前
Redis - 客户端基本介绍
开发语言·数据库·redis·缓存
赵谨言25 分钟前
运用Python编程计算减压孔板孔口直径的研究
大数据·开发语言·经验分享·python
李慕婉学姐31 分钟前
【开题答辩过程】以《智能小区物业管理系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·数据库·后端
njsgcs32 分钟前
用python打开exe 不闪退 0x01000000 # CREATE_BREAKAWAY_FROM_JOB
开发语言·python
橙露38 分钟前
全栈开发入门:Python Flask+Vue3 搭建前后端分离的博客系统
开发语言·python·flask
黎雁·泠崖40 分钟前
【魔法森林冒险】13/14 支线任务 & 计分系统:丰富性与结局
java·开发语言
Project_Observer41 分钟前
Zoho Projects自动化:状态变更时自动创建依赖任务
linux·数据库·windows
夕除42 分钟前
js-20
开发语言·javascript·windows
sheji341644 分钟前
【开题答辩全过程】以 基于Java的甜品蛋糕网上商城的设计与实现为例,包含答辩的问题和答案
java·开发语言