qt反射基础

news/2024/12/29 17:37:50/

最近研究了一下QT的反射机制,
Qt的元对象系统除了提供信号/槽机制的特性之外,它还提供了以下特性:

QObject::metaObject()
返回关联的元对象

QMetaObject::className()
在运行时状态下返回类名

QObject::inherits()
判断类的继承关系

QObject::tr(),QObject::trUtf8()
提供国际化,翻译字符串

QObject::setProperty(),QObject::property()
通过名称来动态设置和获取属性

QMetaObject::newInstance()
创建新实例

通过QObject::metaObject()方法, 所有继承于QObject的类可以 返回元对象系统为其生成的metaObject对象。QMetaObject提供的一些重要信息:

QMetaClassInfo
通过宏Q_CLASSINFO的支持,提供类的附加信息

QMetaEnum
Qt特色的枚举对象,支持key和 value之间的互转

QMetaMethod
提供类成员函数的元数据

QMetaProperty
提供类成员属性的元数据

Qt反射前期准备
1、首先得继承于Q_Object,同时需要在class中加入Q_OBJECT。
2、注册类成员变量需要使用Q_PROPERTY
  Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是关键字
  Type表示成员的类型(不支持自定义类型,对Qt很多基本类型都支持);
  Member代表你给该成员另外起的名字,可以和变量名不同;get,set就是自己在C++函数里面定义的基本的访问函数名,不需要写参数。

3、注册类成员函数
  如果你希望这个函数能够被反射,那么很简单,只需要在类的函数声明前加入Q_INVOKABLE关键字。
参考文章:
https://blog.csdn.net/playstudy/article/details/7861329
https://www.cnblogs.com/RainyBear/p/5251440.html

下面是我自己编写的实例:
1.右击QT Creater中的项目名——添加新文件——选择C++ Class——Choose——取个Class name:TestClass——Base Class选择QObject——点击下一步——在项目文件列表中会增加一个testclass.h和testclass.cpp
testclass.h中如下:

#ifndef TESTCLASS_H
#define TESTCLASS_H
#include
class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = 0);
Q_INVOKABLE int sum(int na,int nb);
Q_INVOKABLE int decrease(int na, int nb);
signals:
public slots:
};
#endif // TESTCLASS_H

testclass.cpp中如下:
#include “testclass.h”
TestClass::TestClass(QObject *parent) : QObject(parent)
{

}
int TestClass::sum(int na,int nb)
{return na+nb;
}
int TestClass::decrease(int na, int nb)
{return na-nb;
}

#include “testclass.h”
TestClass::TestClass(QObject *parent) : QObject(parent)
{

}
int TestClass::sum(int na,int nb)
{return na+nb;
}
int TestClass::decrease(int na, int nb)
{return na-nb;
}

void MainWindow::on_ShowClassInfo_clicked()
{
TestClass classTestClass;
const QMetaObject *theMetaObject = classTestClass.metaObject();//定义一个QMetaObject对象指针,用来获取类classTestClass的相关信息
int nMetathodCount = theMetaObject->methodCount();
for(int nMetathodIndex = 0;nMetathodIndex < nMetathodCount;nMetathodIndex++)
{
QMetaMethod oneMethod = theMetaObject->method(nMetathodIndex);
qDebug() <<"MethodName: " <<oneMethod.name();
qDebug() <<"parameterNames: " <<oneMethod.parameterNames();
qDebug()<<“parameterTypes” << oneMethod.parameterTypes();
qDebug() <<"typeName: " <<oneMethod.typeName();
qDebug() <<“signature: " <<oneMethod.Signal;
qDebug() <<“methodType: " <<oneMethod.methodType() <<”\n”;
}
}

程序运行后,点击ShowClassInfo按钮,在“应用程序输出”界面会显示如下信息:

MethodName: “destroyed”
parameterNames: (“”)
parameterTypes (“QObject*”)
typeName: void
signature: 1
methodType: 1

MethodName: “destroyed”
parameterNames: ()
parameterTypes ()
typeName: void
signature: 1
methodType: 1

MethodName: “objectNameChanged”
parameterNames: (“objectName”)
parameterTypes (“QString”)
typeName: void
signature: 1
methodType: 1

MethodName: “deleteLater”
parameterNames: ()
parameterTypes ()
typeName: void
signature: 1
methodType: 2

MethodName: “_q_reregisterTimers”
parameterNames: (“”)
parameterTypes (“void*”)
typeName: void
signature: 1
methodType: 2

MethodName: “sum”
parameterNames: (“na”, “nb”)
parameterTypes (“int”, “int”)
typeName: int
signature: 1
methodType: 0

MethodName: “decrease”
parameterNames: (“na”, “nb”)
parameterTypes (“int”, “int”)
typeName: int
signature: 1
methodType: 0


http://www.ppmy.cn/news/1264500.html

相关文章

Codeforces Round 914 (Div. 2)补题

Forked!&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;在棋盘中&#xff0c;我们指定骑士的运动方式——向一个方向运动a&#xff0c;然后向另一个方向运动b&#xff0c;两个方向必须是垂直关系。骑士此时能从一个点&#xff0c;进行两次这样的运动&…

动手学习深度学习-跟李沐学AI-自学笔记(3)

一、深度学习硬件-CPU和GPU 芯片&#xff1a;Intel or AMD 内存&#xff1a;DDR4 显卡&#xff1a;nVidia 芯片可以和GPU与内存通信 GPU不能和内存通信 1. CPU 能算出每一秒能运算的浮点运算数&#xff08;大概0.15左右&#xff09; 1.1 提升CPU利用率 1.1.1 提升缓存…

jeecg-boot queryFieldBySql接口基于SSTI的任意代码执行漏洞复现 [附POC]

文章目录 jeecg-boot queryFieldBySql接口基于SSTI的任意代码执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议jeecg-boot queryFieldBySql接口基于SSTI的任意代码执行漏洞复现 [附POC] 0x01 前…

Stable Diffusion 系列教程 - 2 WebUI 参数详解

Stable Diffusion 的整个算法组合为&#xff1a; UNet VAE 文本编码器 UNet&#xff1a;就是我们大模型里的核心。 文本编码器&#xff1a;将我们的prompt进行encoder为算法能理解的内容&#xff08;可以理解为SD外包出去的项目CLIP&#xff09;。 VAE&#xff1a;对UNet生…

IDEA如何运行SpringBoot+Vue前后端分离的项目(超详细截图)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

力扣44题通配符匹配题解

44. 通配符匹配 - 力扣&#xff08;LeetCode&#xff09; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 …

expdp单独导出导入dblink

文章目录 前言一、实现步骤获取ddl方式&#xff08;不可行&#xff09;expdp单独导出dblink 二、impdp单独导入dblink 前言 在实际工作中可能会遇到测试或者迁移工作&#xff0c;对于数据库建立较多的dblink应用重新建立dblink工作量较大&#xff0c;此时可以通过逻辑导出导入…

Linux权限命令详解

Linux权限命令详解 文章目录 Linux权限命令详解一、什么是权限&#xff1f;二、权限的本质三、Linux中的用户四、linux中文件的权限4.1 文件访问者的分类&#xff08;人&#xff09;4.2 文件类型和访问权限&#xff08;事物属性&#xff09; 五、快速掌握修改权限的做法【第一种…