QT笔记——QT类反射机制简单学习

这篇具有很好参考价值的文章主要介绍了QT笔记——QT类反射机制简单学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习 QT的 类反射机制

使用Qt 反射机制的条件

1.需要继承自QObject 类 或者 它的 派生类 ,并需要在类中加入Q_OBJECT 宏
2.注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入Q_INVOKABLE 宏。
3.注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。
4.注册枚举变量:若希望枚举能被反射,需要使用Q_ENUM 或者 Q_FLAGS宏。

QT笔记——QT类反射机制简单学习

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();
}

运行部分截图:

注册的部分信息
QT笔记——QT类反射机制简单学习

这是我们写的 返回类型 void 参数名称 a,b 必须要加Q_INVOKABLE
QT笔记——QT类反射机制简单学习
我们定义的 setName 和 getName;
QT笔记——QT类反射机制简单学习

这是我们类的 对象的属性 以及返回的类型
QT笔记——QT类反射机制简单学习
这是我们定义的 Q_PROPERTY(QString m_name READ getName WRITE setName)中的 m_name
QT笔记——QT类反射机制简单学习

我们的枚举集合的解读 和 利用反射静态原对象 来 调用函数 必须加 Q_ENUM或者 Q_FLAGS
QT笔记——QT类反射机制简单学习

QT类反射机制一
QT类反射机制二
QT类反射机制三
QT类反射机制四文章来源地址https://www.toymoban.com/news/detail-483643.html

到了这里,关于QT笔记——QT类反射机制简单学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制

    【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制

    博客主页:Duck Bro 博客主页 系列专栏:Qt 专栏 关注博主,后期持续更新系列文章 如果有错误感谢请大家批评指出,及时修改 感谢大家点赞👍收藏⭐评论✍ 文章编号:Qt 学习笔记 / 17 1. 简介 windowTitle属性是一种在用户界面中显示窗口的标题的属性。它可以用来设置窗口的标

    2024年04月15日
    浏览(11)
  • Java学习路线(23)——反射机制

    一、概述 (一)什么是反射: 反射指的是任何一个Class类,在“运行时”都可以直接得到全部成分。 (二)动态可获取的对象: 构造器对象——Constructor,成员变量对象——Field,成员方法对象——Method。 (三)反射关键: 第一步都是得到编译后的Class对象,然后可以获得

    2024年02月08日
    浏览(9)
  • Qt学习笔记之二--创建一个简单的qt互动界面(超级无敌巨详细,0基础也能会,主打的就是图多,语句通俗)

    Qt学习笔记之二--创建一个简单的qt互动界面(超级无敌巨详细,0基础也能会,主打的就是图多,语句通俗)

      选择第一个选项,然后两个下一步------ 直到   这里要选择基类,我们选择Qwiget  至于为什么,可以看看我收藏的这篇博客QMainWindow和QWidget的区别_qwidget和qmainwindow_独行侠_阿涛的博客-CSDN博客 ok,创建完成后,我们使用快捷键Ctrl+R来运行一下,看看是否会弹出小窗口,弹出说

    2024年02月05日
    浏览(11)
  • [重走长征路]反射学习笔记

    2024年02月10日
    浏览(6)
  • 从零开始学习 Java:简单易懂的入门指南之反射(三十八)

    ​ 专业的解释: ​ 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; ​ 对于任意一个对象,都能够调用它的任意属性和方法; ​ 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。 ​ 通俗的理解: 利用 反射 创建的对象 可

    2024年02月08日
    浏览(46)
  • Java SE 学习笔记(十七)—— 单元测试、反射

    Java SE 学习笔记(十七)—— 单元测试、反射

    开发好的系统中存在很多方法,如何对这些方法进行测试? 以前我们都是将代码全部写完再进行测试。其实这样并不是很好。在以后工作的时候,都是写完一部分代码,就测试一部分。这样,代码中的问题可以得到及时修复。也避免了由于代码过多,从而无法准确定位到错误

    2024年02月06日
    浏览(11)
  • 反射 p1 反射机制

    反射 p1 反射机制

    这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码的情况下,来控制程序,也符合设计模式的OCP原则(开闭原则:不修改源码,扩展功能)。 代码演示: re.properties文件: Cat类: ReflectionQuestion: 反射机制允许程序在执行期间借助于Reflection API取得任何类

    2024年02月16日
    浏览(10)
  • Java的反射机制

    Java 的反射机制允许在程序运行期间,借助反射 API 获取类的内部信息,并能直接操作对象的内部属性及方法。 Java 反射机制提供的功能: 在运行时,使用反射分析类的能力,获取有关类的一切信息(类所在的包、类实现的接口、标注的注解、类的数据域、类的构造器、类的

    2024年02月02日
    浏览(11)
  • Java反射机制是什么?

    Java反射机制是什么?

    Java 反射机制 是 Java 语言的一个重要特性。 在学习 Java 反射机制前,大家应该先了解两个概念,编译期和运行期。 编译期 是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把

    2024年02月12日
    浏览(7)
  • 什么是反射机制

    1.什么是类对象: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。 比方有一个Hero类:类对象就是用于描述这种类,都有什么属性,什么方法的。 获取类对象有3种方式 Class.forName Hero.class new Hero().get

    2024年02月05日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包