qt反射基础

最近研究了一下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.mzph.cn/news/211525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发之封装优化

面向对象开发离不开封装&#xff0c;将重复的可以复用的代码封装起来&#xff0c;提高开发效率。 基于之前的List&#xff0c;对代码进行封装。 1、抽取component 将List的头部抽离出来作为一个新的component。可以创建一个新的ArkTS文件&#xff0c;写我们的头部代码 为了…

代理模式:解析对象间的间接访问与控制

目录 引言 理解代理模式 不同类型的代理模式 代理模式的应用场景 代理模式的优缺点 优点 缺点 实际案例&#xff1a;Java中的代理模式应用 结语 引言 代理模式是软件设计模式中的一种结构型模式&#xff0c;旨在为其他对象提供一种代理以控制对这个对象的访问。它允许你…

消息队列使用指南

介绍 消息队列是一种常用的应用程序间通信方法&#xff0c;可以用来在不同应用程序或组件之间传递数据或消息。消息队列就像一个缓冲区&#xff0c;接收来自发送方的消息&#xff0c;并存储在队列中&#xff0c;等待接收方从队列中取出并处理。 在分布式系统中&#xff0c;消…

死锁问题,4个必要条件+避免死锁

目录 引入 死锁 概念 示例 多把锁 单锁 4个必要条件 用途 引入 我们用加锁的方式保证了多个线程访问临界资源时,不会出现数据紊乱的问题 但是,锁的引入,会导致出现其他的问题 死锁 概念 在多线程或多进程的并发环境中&#xff0c;两个或多个进程或线程被永久阻塞&…

esxi全称“VMware ESXi

esxi全称“VMware ESXi”&#xff0c;是可直接安装在物理服务器上的强大的裸机管理系统&#xff0c;是一款虚拟软件&#xff1b;ESXi本身可以看做一个操作系统&#xff0c;采用Linux内核&#xff0c;安装方式为裸金属方式&#xff0c;可直接安装在物理服务器上&#xff0c;不需…

数据结构算法-希尔排序算法

引言 在一个普通的下午&#xff0c;小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐&#xff0c;更是要用扑克牌来决定谁是真正的“大老板”。 然而&#xff0c;小明的牌就像刚从乱麻中取出来的那样&#xff0c;毫无头绪。小森的牌也像是被小丑掷…

Agent学习笔记

背景&#xff1a;LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了&#xff0c;ChatGPT很强大&#xff0c;但是也有做不到的东西。例如&#xff1a; 实时查询问题&#xff1a;实时的天气&#xff0c;地理位置&#xff0c;最新新闻报道&#xff0c;现实世界…

十年婚姻·总结八

十年婚姻总结八 女人一生的合伙人不能只是帅哥哥 女人一生的合伙人不能只是帅哥哥 浪漫的本质还是你的筹码。 比如你送男人5万的手表&#xff0c;但你没什么其他筹码&#xff08;皮肤粗糙蜡黄、没人脉金钱资源、长的胖&#xff09;。 那个男人会觉得你胡闹&#xff0c;你送的…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…

引用文献算作重复率么【一文读懂】

大家好&#xff0c;今天来聊聊引用文献算作重复率么&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 引用文献算作重复率么 在学术研究和论文撰写过程中&#xff0c;引用文献是不可或缺的一部分小发猫伪…

shell学习1——txt文件备份,文件名加个年月日的后缀,如test.txt对于备份文件为test.txt_20231205

跟B站Up主学习shell脚本——阿铭linux 3461576172505894 需求 txt文件备份&#xff0c;文件名加个年月日的后缀&#xff0c;如test.txt对于备份文件为test.txt_20231205 代码 #!/bin/bash ##定义后缀变量 suffixdate %Y%m%d##找到/test/目录下的txt文件 for f in find /tes…

ubuntu源配置文件/etc/apt/sources.list不存在

若使用命令sudo apt-get update报错&#xff1a;apt-get:找不到命令&#xff0c;八成是源配置文件/etc/apt/sources.list不存在。但是一般来说不会不存在&#xff0c;若真的不小心删除的话&#xff0c;我们也可以进行恢复。 首先创建/etc/apt/sources.list文件&#xff0c;然后…

安卓与串口通信-如何区分连接的设备?

前言与背景 一般来说&#xff0c;不管是在什么平台上需要与外接硬件交互&#xff0c;第一件事都是应该能够正确的识别出目标硬件。 例如在 Windows 上&#xff0c;当一个新的外设设备被插入到我们的电脑时&#xff0c;系统会通过 Hardware IDs 、Compatible IDs 来确定连接的…

看图学源码之 Atomic 类源码浅析二(cas + 分治思想的原子累加器)

原子累加器 相较于上一节看图学源码 之 Atomic 类源码浅析一&#xff08;cas 自旋操作的 AtomicXXX原子类&#xff09;说的的原子类&#xff0c;原子累加器的效率会更高 XXXXAdder 和 XXXAccumulator 区别就是 Adder只有add 方法&#xff0c;Accumulator是可以进行自定义运算方…

ufw常用命令解析

命令 举例 解释 ufw enable — 启用防火墙 ufw disable — 禁用防火墙 ufw status — 查看防火墙状态与规则 ufw default ARG sudo ufw default allow sudo ufw default deny 将默认策略设置为允许所有未明确规定的流量 将默认策略设置为拒绝所有未明确规定的流量…

大数据技术5:OLAP引擎对比分析

前言&#xff1a;数据仓库建设&#xff0c;初级的理解就是建表&#xff0c;将业务数据、日志数据、消息队列数据等&#xff0c;通过各种调度任务写入到表里供OLAP引擎使用。但要想建好数仓也是一个复杂、庞大的工程&#xff0c;比如要考虑&#xff1a;数据清洗、数据建模&#…

001 LLM大模型之Transformer 模型

参考《大规模语言模型--从理论到实践》 目录 一、综述 二、Transformer 模型 三、 嵌入表示层&#xff08;位置编码代码&#xff09; 一、综述 语言模型目标是建模自然语言的概率分布&#xff0c;在自然语言处理研究中具有重要的作用&#xff0c;是自然 语言处理基础任务之一…

第 119 场 LeetCode 双周赛题解

A 找到两个数组中的公共元素 模拟 class Solution { public:vector<int> findIntersectionValues(vector<int> &nums1, vector<int> &nums2) {unordered_set<int> s1(nums1.begin(), nums1.end()), s2(nums2.begin(), nums2.end());vector<…

【基于大数据的人肥胖程度预测分析与可控策略】

基于大数据的人肥胖程度预测分析与可控策略 前言数据获取与清洗数据挖掘与分类建模1. K-means聚类2. 层次聚类3. DBSCAN4. 分类建模 数据可视化模型肥胖程度预测分析与可控策略结语 前言 随着现代生活方式的改变&#xff0c;肥胖问题逐渐成为全球性的健康挑战。为了更好地理解…

实用篇 | 3D建模中Blender软件的下载及使用[图文详情]

本文基于数字人系列的3D建模工具Blender软件的安装及使用&#xff0c;还介绍了图片生成3D模型的AI工具~ 目录 1.Blender的下载 2.Blender的使用 3.安装插件(通过压缩包安装) 4.实例 4.1.Blender使用MB-Lab插件快速人体模型建构 4.1.1.点击官网&#xff0c;进行下载 4.1.…