Qt实现类反射机制

前言
Qt可以像JAVA一样实现反射类,使用时直接使用类名就可以创建类。本文反射类的封装,实现与优缺点
一、反射类的封装


//反射类的宏定义

/*****************************************************************************
* @brief : GetReflectionClass 这是一个反射函数 该函数只负责创建,不负责销毁
* @author : anjj
* @date :2021/09/09 14:10
* @version : 1.0
* @inparam : QString strClassName 函数名称
*			 QObject * parent 父类
*			 
* @outparam :
* @return :该函数将返回模板T
* 示例CICD_ANALYSIS_BASE * pIcd = GetReflectionClass<CICD_ANALYSIS_BASE>("CICD_CAT021_V0DOT26", this);
*****************************************************************************/
 template <class T> 
 T*  GetReflectionClass(QString strClassName, QObject * parent)
 {
	 strClassName += "*";//类名后面必须带指针 * 否则无法找到反射类
	 int type = QMetaType::type(strClassName.toUtf8());
	 const QMetaObject *metaObj = QMetaType::metaObjectForType(type);
	 if (nullptr == metaObj)
	 {
		 return nullptr;
	 }
	 QObject *obj = metaObj->newInstance(Q_ARG(QObject*, parent));
	 return qobject_cast<T*>(obj);
 }

 /*****************************************************************************
 * @brief : IMPORT_CLASS_NAME 注册反射类名 宏
 * @author : anjj
 * @date :2021/09/09 14:13
 * @version : 1.0
 * @inparam : 
 *			 
 *			 
 * @outparam :
 * @return :
 * 示例 int CICD_CAT021_V0DOT26::nTypeId = IMPORT_CLASS_NAME(CICD_CAT021_V0DOT26)
 *****************************************************************************/
#define  IMPORT_CLASS_NAME(name) qRegisterMetaType<name*>();

二、使用方法
首先需要反射的那个类需要先注册自己的类名

//注册反射函数,使用时根据类名就能创建函数
int CICD_CAT021_V2DOT1::nTypeId = IMPORT_CLASS_NAME(CICD_CAT021_V2DOT1);

类CICD_ANALYSIS_BASE 是类CICD_CAT021_V2DOT1的基类
类 CICD_ANALYSIS_BASE 继承 QObject
使用的时候调用GetReflectionClass + 注册类名就能反射你当时注册的函数了

CICD_ANALYSIS_BASE * pIcd = GetReflectionClass<CICD_ANALYSIS_BASE>("CICD_CAT021_V2DOT1", this);
if (nullptr == pIcd)
{
	qDebug()<< QStringLiteral("反射数据类不存在:CICD_CAT021_V2DOT1");
	return;
}

三、反射类的优缺点
缺点:速度慢
优点:运行期类型的判断,动态加载类,提高代码灵活度。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值