设为首页 加入收藏

TOP

[Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM(一)
2023-09-09 10:25:47 】 浏览:204
Tags:谈关于 元对象 Q_ENUM

[Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM

前言

最近在开发的时候,我自己写了一套虚函数。这也是我第一次写这么大一个框架,遇到了一些有点莫名其妙的问题(也不能算莫名奇妙,只能说有点玩不明白),详情可以见

[Qt开发思想探幽]QObject、模板继承和多继承

前两天我写了一些demo验证了一些我的想法,算是在元对象编程里简单的游了一游。

一、元对象

Qt的元对象是一个让人又爱又恨的东西。让人爱是因为它确实功能强大,可以允许我们从类、枚举类型、获得一些我们在正常C++开发中可能无法正常获取到的东西。比如最简单的:在正常C++开发中,枚举类型的类型名称对于C++而言只是一个有一个的十六进制码,而不是字符串的形式,也不可能获得字符串,那么可能就有如下的奇技淫巧:

在这里插入图片描述
在这里插入图片描述
没错,以上就是通过 Qt的元对象类型将一个枚举类型的成员转换成字符串,或者将字符串转回枚举类型的值

更变态的是什么?

更变态的是,通过元对象类型我们可以实现一个更夸张的功能:让一个类和一个Json字符串之间做转换:

在这里插入图片描述
当然了,做转换的前提是使用Q_PROPERTY宏包裹着属性,这样这个属性就被注册进了这个类的元对象系统内,然后就可以通过一些奇技淫巧,来实现类成员变量和字符串之间的转换了,以下是一个例子:

#pragma region Lev_Json
/// <summary>
/// name:Lev_Json
/// 说明:此类用作辅助参数类与json字符串之间的转换,使用此类请使用Q_PROPERTY声明所有的类成员变量
/// </summary>
class Lev_Json : QObject {

public:
	template<class T1>
	static bool ValidateJsonKeys(const QString& jsonString, const T1* T_Class) {
		QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
		if (!jsonDoc.isObject()) {
			return false;
		}

		QJsonObject jsonObject = jsonDoc.object();
		const QMetaObject* metaObject = T_Class->metaObject();

		for (int i = 0; i < metaObject->propertyCount(); ++i) {
			QMetaProperty property = metaObject->property(i);
			QString propName = property.name();
			if (propName.contains("objectName"))
				continue;
			if (!jsonObject.contains(propName)) {
				return false;
			}
		}

		return true;
	}
	/// <summary>
	/// 判断这个Json字符串对于这个Object而言是否合法
	/// </summary>
	/// <typeparam name="T1"></typeparam>
	/// <param name="jsonString"></param>
	/// <returns></returns>
	template<class T1>
	static bool ValidateJsonKeys(const QString& jsonString, QSharedPointer<T1> T_Class_1) {
		QObject* T_Class = dynamic_cast<QObject*>(T_Class_1.data());
		QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
		if (!jsonDoc.isObject()) {
			return false; // Return false if JSON is not an object
		}

		QJsonObject jsonObject = jsonDoc.object();
		const QMetaObject* metaObject = T_Class->metaObject();

		for (int i = 0; i < metaObject->propertyCount(); ++i) {
			QMetaProperty property = metaObject->property(i);
			QString propName = property.name();

			if (!jsonObject.contains(propName)) {
				return false;
			}
		}

		return true;
	}
	/// <summary>
	/// 推荐,序列化Qt对象,请用Q_PROPERTY包裹成员变量,使用内存安全的QSharedPointer
	/// </summary>
	/// <typeparam name="T1">模板对象,可以不声明,会自动识别</typeparam>
	/// <param name="T_Class_1">输入的对象</param>
	/// <returns></returns>
	template<class T1>
	static QString JsonSerialization(QSharedPointer<T1> T_Class_1) {
		QJsonObject ret;
		QObject* T_Class = dynamic_cast<QObject*>(T_Class_1.data());
		const QMetaObject* metaObject = T_Class->metaObject();

		for (int i = 0; i < metaObject->propertyCount(); ++i) {
			QMetaProperty property_ = metaObject->property(i);
			QVariant propValue = property_.read(T_Class);

			
首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++算法之旅、04 基础篇 | 第一章.. 下一篇C++系列三:QT初识

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目