2. qt_c++反射实例

目录

  • 使用场景
  • 元对象相关类及宏
  • 常用功能
  • 获取类相关内容以及委托调用

使用场景

Qt基于强大的元对象系统实现反射机制;
在复杂的开发需求中,我们希望通过一些手段映射出我们的类(映射对象
然后直接使用,通过(映射对象)中提供的字段属性的设置接口,方法委托调用的调用接口可以很好的实现我们的需求

元对象相关类及宏

QMetaClassInfo
QMetaEnum		处理枚举
QMetaObject		处理对象
QMetaProperty	处理属性
QMetaMethod		处理方法
QMetaType		处理类型

Q_PROPERTY属性
Q_INVOKABLE方法

常用功能

先创建一个派生QObject的类SysUser
SysUser.h

#ifndef SYSUSER_H
#define SYSUSER_H

#include <QObject>

class SysUser : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int id READ getId WRITE setId)

public:
    explicit SysUser(QObject *parent = nullptr);
    SysUser(const SysUser &other);

public:
    Q_INVOKABLE int getId();
    Q_INVOKABLE void setId(int id);


private:
    int id;

signals:

public slots:
};


#endif // SYSUSER_H

SysUser.cpp

#include "SysUser.h"
#include <QDebug>

SysUser::SysUser(QObject *parent) : QObject(parent)
{
    id = 1;
}

SysUser::SysUser(const SysUser &other)
{

}

int SysUser::getId()
{
    return id;
}

void SysUser::setId(int id)
{
    this->id = id;
}

获取类相关内容以及委托调用

    qDebug()<< SysUser::staticMetaObject.className(); //获取类名
    qDebug()<< SysUser::staticMetaObject.propertyCount(); //获取属性个数
    qDebug()<< SysUser::staticMetaObject.methodCount(); //获取方法个数
    qDebug()<< SysUser::staticMetaObject.constructorCount(); //获取构造器个数

    //-----属性相关, 只能操作Q_PROPERTY暴露的属性
    SysUser user;
    qDebug()<< user.setProperty("id","123"); //修改属性值
    qDebug()<< user.property("id"); //获取属性值
    qDebug()<< SysUser::staticMetaObject.property(1).name(); //获取属性名
    qDebug()<< SysUser::staticMetaObject.property(1).isWritable(); //判断属性是否可写
    qDebug()<< SysUser::staticMetaObject.property(1).isReadable(); //判断属性是否可读
    qDebug()<< SysUser::staticMetaObject.property(1).typeName(); //获取属性类型名
    qDebug()<< SysUser::staticMetaObject.property(1).userType(); //获取属性类型值
    qDebug()<< SysUser::staticMetaObject.property(1).type(); //获取属性QVariant类型枚举
    qDebug()<< SysUser::staticMetaObject.property(1).isUser(); //判断是否为用户自定义类型属性, 用QMetaType注册的类型
    qDebug()<< SysUser::staticMetaObject.property(1).isValid(); //判断是否有效

    //-----方法相关,只能操作Q_INVOKABLE暴露的方法
    qDebug()<< SysUser::staticMetaObject.method(5).name(); //获取方法名
    int res;
    QMetaObject::invokeMethod(&user,"getId",Qt::DirectConnection, Q_RETURN_ARG(int,res)); //同步执行
    //QMetaObject::invokeMethod(&user,"getId",Qt::QueuedConnection, Q_RETURN_ARG(int,res)); //异步执行
    qDebug()<< res;


    //-----动态构造,只能操作qRegisterMetaType<SysUser>("SysUser");注册了的类型
    qDebug()<< QMetaType::type("SysUser"); //=0表示找不到此类型
    qDebug()<< QMetaType::create(QMetaType::type("SysUser"));//构造对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885889.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试--文件上传常用绕过方式

文件上传常用绕过方式 1.前端代码&#xff0c;限制只允许上传图片。修改png为php即可绕过前端校验。 2.后端校验Content-Type 校验文件格式 前端修改&#xff0c;抓取上传数据包&#xff0c;并且修改 Content-Type 3.服务端检测&#xff08;目录路径检测&#xff09; 对目…

医院体检管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;体检分类管理&#xff0c;体检套餐管理&#xff0c;体检预约管理&#xff0c;体检报告管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;体检套餐&a…

四、Drf认证组件

四、Drf认证组件 4.1 快速使用 from django.shortcuts import render,HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.authentication import BaseAuthentication from rest_framework.exception…

数据结构:将复杂的现实问题简化为计算机可以理解和处理的形式

整句话的总体意义是&#xff0c;**数据结构是用于将现实世界中的实体和关系抽象为数学模型&#xff0c;并在计算机中表示和实现的关键工具**。它不仅包括如何存储数据&#xff0c;还包括对这些数据的操作&#xff0c;能够有效支持计算机程序的运行。通过这一过程&#xff0c;数…

利用PDLP扩展线性规划求解能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Java项目实战II基于Java+Spring Boot+MySQL的甘肃非物质文化网站设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 甘肃省作为中国历史文化名省&#xff0c;拥有丰富的非物质文化遗产资源&#xff0c;涵盖表演艺术、手…

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同&#xff0c;类型也在改变&#xff0c;以后怎么写类型&#xff1f; 1. 封装Axios 将Axios封装成一个类&#xff0c;同时重新封装request方法 重新封装request有几个好处&#xff1a; 所有的请求将从我们定义的requet请求中发送&#xff0c;这样以后更换…

Golang | Leetcode Golang题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }

【Unity服务】如何使用Unity Version Control

Unity上的线上服务有很多&#xff0c;我们接触到的第一个一般就是Version Control&#xff0c;用于对项目资源的版本管理。 本文介绍如何为项目添加Version Control&#xff0c;并如何使用&#xff0c;以及如何将项目与Version Control断开链接。 其实如果仅仅是对项目资源进…

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

学习记录:js算法(五十):二叉树的右视图

文章目录 二叉树的右视图我的思路网上思路 总结 二叉树的右视图 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 图一&#xff1a; 示例 1:如图一 输入: [1,2,3,null,5,null,4] …

C++面向对象基础

目录 一.函数 1.内联函数 2.函数重载 3.哑元函数 二.类和对象 2.1 类的定义 2.2 创建对象 三. 封装&#xff08;重点&#xff09; 四. 构造函数 constructor&#xff08;重点&#xff09; 4.1 基础使用 4.2 构造初始化列表 4.3 构造函数的调用方式&#xff08;掌握…

解决方法:PDF文件打开之后不能打印?

打开PDF文件之后&#xff0c;发现文件不能打印&#xff1f;这是什么原因&#xff1f;首先我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

秋招内推--招联金融2025

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

数据结构-LRU缓存(C语言实现)

遇到困难&#xff0c;不必慌张&#xff0c;正是成长的时候&#xff0c;耐心一点&#xff01; 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…

SigmaStudio控件Cross Mixer\Signal Merger算法效果分析

衰减与叠加混音算法验证分析一 CH2:输入源为-20dB正弦波1khz CH1叠加混音&#xff1a;参考混音算法https://blog.csdn.net/weixin_48408892/article/details/129878036?spm1001.2014.3001.5502 Ch0衰减混音&#xff1a;外部多个输入源做混音时&#xff0c;建议参考该算法控件&…

在VMware虚拟机上部署polardb

免密登录到我们的虚拟机之后&#xff0c;要在虚拟机上部署polardb数据库&#xff0c;首先第一步要先克隆源码&#xff1a; 为了进SSH协议进行传输源码需要先进行下面的步骤&#xff1a; 将宿主机上的私钥文件复制到虚拟机上 scp "C:\Users\waitw\.ssh\id_rsa" ann…

Azkaban:大数据任务调度与编排工具的安装与使用

在当今大数据时代&#xff0c;数据处理和分析任务变得越来越复杂。一个完整的大数据分析系统通常由大量任务单元组成&#xff0c;如 shell 脚本程序、mapreduce 程序、hive 脚本、spark 程序等。这些任务单元之间存在时间先后及前后依赖关系&#xff0c;为了高效地组织和执行这…

Leetcode 每日一题:Crack The Safe

写在前面&#xff1a; 学期真的忙起来了&#xff0c;我的两个社团也在上一周终于完成了大部分招新活动。虽然后面有即将到来的期中考试和求职&#xff0c;但希望能有时间将帖子的频率提上去吧&#xff08;真的尽量因为从做题思考到写博客讲解思路需要大量的时间&#xff0c;在…

当人工智能拥抱餐饮业,传统与创新的交融

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 今天我们要聊一个充满烟火气的行业&#x…