当前位置:网站首页>QT笔记——QT类反射机制简单学习
QT笔记——QT类反射机制简单学习
2022-08-02 10:59:00 【旧街凉风°】
学习 QT的 类反射机制
使用Qt 反射机制的条件
1.需要继承自QObject 类 或者 它的 派生类 ,并需要在类中加入Q_OBJECT 宏
2.注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入Q_INVOKABLE 宏。
3.注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。
4.注册枚举变量:若希望枚举能被反射,需要使用Q_ENUM 或者 Q_FLAGS宏。
QMetaObjectTest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QMetaObjectTest.h"
#include <QMetaObject>
#include <QDebug>
class QMetaObjectTest : public QWidget
{
Q_OBJECT
Q_CLASSINFO("author", "lion_cxq")
Q_PROPERTY(QString m_name READ getName WRITE setName)
public:
Q_INVOKABLE QMetaObjectTest(QWidget *parent = Q_NULLPTR);
enum PriorityType{
High,
Low,
VeryHigh,
VeryLow
};
Q_ENUM(PriorityType)
Q_INVOKABLE void setName(QString name);
Q_INVOKABLE QString getName();
Q_INVOKABLE void testMessage(int a ,int b);
private:
Ui::QMetaObjectTestClass ui;
QString m_name;
};
QMetaObjectTest.cpp
#include "QMetaObjectTest.h"
QMetaObjectTest::QMetaObjectTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
void QMetaObjectTest::testMessage(int a,int b)
{
qDebug() <<QStringLiteral("参数一:") << a<< QStringLiteral("参数二:") << b;
}
void QMetaObjectTest::setName(QString name)
{
m_name = name;
}
QString QMetaObjectTest::getName()
{
return m_name;
}
main.cpp
#include "QMetaObjectTest.h"
#include <QtWidgets/QApplication>
#include <QMetaObject>
#include <QMetaMethod>
#include <QDebug>
#include <QMetaProperty>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMetaObjectTest object;
const QMetaObject* theMetaObject = object.metaObject();
//该类的类名
qDebug() <<QStringLiteral("类名:") << theMetaObject->className();
//该类注册的信息
int classInfoIndex;
int classInfoCount = theMetaObject->classInfoCount();
for (classInfoIndex = 0; classInfoIndex < classInfoCount; ++classInfoIndex)
{
QMetaClassInfo classInfo = theMetaObject->classInfo(classInfoIndex);
qDebug() << "name: " << classInfo.name() << " " << "value: " << classInfo.value();
}
//该类的成员
int metathodIndex;
int metathodCount = theMetaObject->methodCount();
for (metathodIndex = 0; metathodIndex < metathodCount; ++metathodIndex)
{
QMetaMethod oneMethod = theMetaObject->method(metathodIndex);
qDebug() << "typeName: " << oneMethod.typeName()<<" "<< "methodType: " << oneMethod.methodType()<<" "<<"parameterNames: " << oneMethod.parameterNames();
}
//该类的 属性
int propertyIndex;
int propertyCount = theMetaObject->propertyCount();
for (propertyIndex = 0; propertyIndex < propertyCount; ++propertyIndex)
{
QMetaProperty oneProperty = theMetaObject->property(propertyIndex);
qDebug() << "name: " << oneProperty.name()<<" "<<"type: " << oneProperty.type();
}
//该对象的 枚举集合
int enumeratorIndex;
int enumeratorCount = theMetaObject->enumeratorCount();
for (enumeratorIndex = 0; enumeratorIndex < enumeratorCount; ++enumeratorIndex)
{
QMetaEnum oneEnumerator = theMetaObject->enumerator(enumeratorIndex);
int enumIndex;
int enumCount = oneEnumerator.keyCount();
for (enumIndex = 0; enumIndex < enumCount; ++enumIndex)
{
qDebug() << oneEnumerator.key(enumIndex) << " ==> " << oneEnumerator.value(enumIndex);
}
}
//获取该类的静态元对象 调用 并且实例化一个对象(我们并没有new它)
QMetaObject metaObj = QMetaObjectTest::staticMetaObject;
QObject* obj = metaObj.newInstance();
QMetaObjectTest* metaObjectTest= qobject_cast<QMetaObjectTest*>(obj);
metaObjectTest->testMessage(10, 20);
return a.exec();
}
运行部分截图:
注册的部分信息
这是我们写的 返回类型 void 参数名称 a,b 必须要加Q_INVOKABLE
我们定义的 setName 和 getName;
这是我们类的 对象的属性 以及返回的类型
这是我们定义的 Q_PROPERTY(QString m_name READ getName WRITE setName)
中的 m_name
我们的枚举集合的解读 和 利用反射静态原对象 来 调用函数 必须加 Q_ENUM或者 Q_FLAGS
边栏推荐
- mysql清除binlog日志文件
- WPF 截图控件之文字(七)「仿微信」
- 3 d laser slam: LeGO - LOAM - ground point extracting method and the analysis of the code
- LayaBox---TypeScript---Iterator and generator
- Hongxing, donate another million
- 记一次mysql查询慢的优化历程
- 循环语句综合练习
- AlphaFold又放大招,剑指整个生物界!
- 从测试入门到测试架构师,这10年,他是这样让自己成才的
- 365天挑战LeetCode1000题——Day 047 设计循环队列 循环队列
猜你喜欢
MapStruct
使用较广泛的安全测试工具有哪些?
Challenge LeetCode1000 questions in 365 days - Day 047 Design Circular Queue Circular Queue
软件工程国考总结——选择题
Deep Learning 100 Examples - Convolutional Neural Network (CNN) for mnist handwritten digit recognition
4年手工测试被应届生取代了,用血与泪的教训给xdm一个忠告,该学自动化了...
同样做软件测试,和月收入 3W 的学弟聊了一晚上,我彻底崩溃了
STM32+MPU6050 Design Portable Mini Desktop Clock (Automatically Adjust Time Display Direction)
ECCV22|PromptDet:无需手动标注,迈向开放词汇的目标检测
21年毕业转行软件测试,从0收入到月薪过万,我真的很幸运...
随机推荐
LayaBox---TypeScript---Iterator and generator
LayaBox---TypeScript---声明合并
划分训练集,验证集,测试集
Event object, do you know it well?
Hongxing, donate another million
Multithreading (Basic) - 40,000 word summary
ES2020-23简单易懂又实用的精选特性讲解 日常开发必备干货!
logo 图标(php图片加文字水印)
Oracle 19c 连接PDB
Oracle 19c配置ob server
阿里云数据存储生态计划发布,助力伙伴数据创新
2022年8月初济南某外包公司全栈开发面试题整理
MySql模糊查询大全
从众多接口中脱颖而出的最稳定的接口——淘宝详情api
开箱即用-使用异步加载布局来优化页面启动速度的几种方案
SQLAlchemy使用教程
【术语科普】关于集成工作台那些难懂的词儿,看这篇秒懂!
Challenge LeetCode1000 questions in 365 days - Day 047 Design Circular Queue Circular Queue
注意力机制
暑期总结3