qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType
qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType
code review!

文章目录
- qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType
- 一.Q_DECLARE_METATYPE
- 使用方法
- 应用场景
- 二.为什么需要注册类型?
- 三.使用 Q_DECLARE_METATYPE 处理自定义类型的简短示例
- 3.1.自定义类型定义
- 3.2.在 QVariant 中存储和检索
- 3.3.在信号和槽中传递
一.Q_DECLARE_METATYPE
Q_DECLARE_METATYPE 是一个 Qt 宏,用于注册某种类型以便在 Qt 的元对象系统中使用。注册后的类型可以在 Qt 的信号和槽机制中使用,特别是当类型作为信号参数传递时。这对于非Qt内建类型来说尤其重要,因为 Qt 的元对象系统需要额外的信息来处理这些类型。
使用方法
-
声明自定义类型:
首先需要创建一个自定义类型。例如:
class MyCustomType { public:int someValue; }; -
使用
Q_DECLARE_METATYPE:在全局命名空间中使用这个宏来声明自定义类型:
Q_DECLARE_METATYPE(MyCustomType) -
注册类型:
为了使 QVariant 能够处理这个自定义类型,还需要在程序的某个地方注册它:
qRegisterMetaType<MyCustomType>("MyCustomType");
应用场景
- 信号和槽: 如果想在信号和槽中传递这个类型的对象,需要注册。
- QVariant: 如果想将自定义类型存储在 QVariant 中。
这样,就可以在 Qt 的各种机制中使用自定义类型了。
二.为什么需要注册类型?
Qt 的信号和槽机制以及变量属性系统依赖于运行时类型信息来动态地进行类型检查和转换。注册类型允许 Qt 知道如何在不同组件间安全地传递这些类型的数据,特别是在不同线程之间。比如,如果想在信号中传递一个自定义数据结构或者 STL 容器,就必须先使用 Q_DECLARE_METATYPE 进行注册。
三.使用 Q_DECLARE_METATYPE 处理自定义类型的简短示例
3.1.自定义类型定义
首先定义一个简单的自定义类型:
// customtype.h
#ifndef CUSTOMTYPE_H
#define CUSTOMTYPE_H#include <QString>class CustomType {
public:CustomType() : name("Default") {}CustomType(const QString &name) : name(name) {}QString getName() const { return name; }void setName(const QString &name) { this->name = name; }private:QString name;
};Q_DECLARE_METATYPE(CustomType)#endif // CUSTOMTYPE_H
3.2.在 QVariant 中存储和检索
接下来,演示如何将自定义类型存储到 QVariant 中,并从中检索。
// main.cpp
#include <QCoreApplication>
#include <QVariant>
#include <QDebug>
#include "customtype.h"int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 注册类型qRegisterMetaType<CustomType>("CustomType");// 创建一个自定义类型实例CustomType original("Example");// 存储在 QVariant 中QVariant variant = QVariant::fromValue(original);// 从 QVariant 中检索if (variant.canConvert<CustomType>()) {CustomType retrieved = variant.value<CustomType>();qDebug() << "Retrieved name:" << retrieved.getName();}return 0;
}
3.3.在信号和槽中传递
最后,展示如何在信号和槽中传递自定义类型。
// sender.h
#ifndef SENDER_H
#define SENDER_H#include <QObject>
#include "customtype.h"class Sender : public QObject {Q_OBJECTpublic:void send() {CustomType data("Signal Data");emit customSignal(data);}signals:void customSignal(CustomType data);
};#endif // SENDER_H// receiver.h
#ifndef RECEIVER_H
#define RECEIVER_H#include <QObject>
#include <QDebug>
#include "customtype.h"class Receiver : public QObject {Q_OBJECTpublic slots:void onCustomSignal(CustomType data) {qDebug() << "Received name:" << data.getName();}
};#endif // RECEIVER_H
// main.cpp
#include <QCoreApplication>
#include "sender.h"
#include "receiver.h"int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);qRegisterMetaType<CustomType>("CustomType");Sender sender;Receiver receiver;QObject::connect(&sender, &Sender::customSignal, &receiver, &Receiver::onCustomSignal);sender.send();return app.exec();
}
相关文章:
qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType
qt-C笔记之Q_DECLARE_METATYPE和qRegisterMetaType code review! 文章目录 qt-C笔记之Q_DECLARE_METATYPE和qRegisterMetaType一.Q_DECLARE_METATYPE使用方法应用场景 二.为什么需要注册类型?三.使用 Q_DECLARE_METATYPE 处理自定义类型的简短示例3.1.自定义类型定…...
Shader 中的光源
1、Shader 开发中常用的光源属性 Unity当中一共支持四种光源类型: 平行光(Directional)点光源(Point)聚光灯(Spot)面光源(Area)— 面光源仅在烘焙时有用 不管光源类型到…...
【django】局域网访问django启动的项目
目录 一、现象 二、django的settings.py配置 三、启动django项目 四、获取本机IP 五、局域网机器访问 前言:本机使用pycharm启动的项目,局域网其他机器访问 一、现象 django开发了接口,想给其他同志访问接口测试,无法通过I…...
【计算机组成原理】主存储器深度解析
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
docker在基础镜像上,比如rockylinux,如何配置yum仓库
在基础镜像rockylinux上 启动的容器,没有yum仓库,就执行不了一些命令 ~]docker run -itd --name linux rockylinux:8.5~]# docker exec -it linux bash /]# ifconfig bash: ifconfig: command not found/]# vim bash: vim: command not found …...
libtorch落地AI项目的一些总结
总结 1. 为啥C 写AI C 是一个非常强大的编程语言,它具有非常强大的计算能力,可以处理非常大的数据集,并且可以非常快速地完成计算。很多项目需要嵌入式部署,C 是一个非常适合的编程语言。C 可以非常快速地完成计算,并…...
ffmpeg面向对象——参数配置秘密探索及其设计模式
目录概览 0.参数配置对象流程图0.1 用到的设计模式0.2 与朴素思想的对比 1.参数传递部分1.1 AVDictionary字典容器类1.1.1 类定义及类图1.1.2 构造函数1.1.3 析构函数1.1.4 设置/读取等配置参数 1.2 参数配置实例 2.参数配置生效部分2.1参数过滤模块2.1.1 AVOption类2.1.1.1 类…...
华为eNSP使用详解
eNSP(Enterprise Network Simulation Platform)是华为提供的一款网络仿真平台,它允许用户在没有真实设备的情况下进行网络实验和学习网络技术。eNSP可以模拟各种网络设备,如交换机、路由器、防火墙等,并支持创建多种网…...
一文入门生成式AI(理解ChatGPT的原理)
一、什么是生成式AI? 以ChatGPT为代表的生成式AI,是对已有的数据和知识进行向量化的归纳,总结出数据的联合概率。从而在生成内容时,根据用户需求,结合关联字词的概率,生成新的内容。 可以这么联想&#x…...
C# 中Faker
在 C# 中,Faker 类通常用于生成模拟数据(也称为虚拟数据、测试数据),这对于开发、测试以及演示应用程序非常有用。一个流行的库叫做 Faker,它提供了一种简单的方式来生成各种随机数据。 安装 Faker 库 要使用 Faker …...
数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2
功能实现 规则转换为 SQL 片段 规则解析 首先我们来构造一个典型的规则,包括两个条件组,每个组由两个条件组成,由且与或两种逻辑关系,如下图: 然后看看生成的规则,如下: {"filt…...
鸿蒙Harmony-Next 徒手撸一个日历控件
本文将介绍如何使用鸿蒙Harmony-Next框架实现一个自定义的日历控件。我们将创建一个名为CalendarView的组件(注意,这里不能叫 Calendar因为系统的日历叫这个),它具有以下功能: 显示当前月份的日历支持选择日期显示农历日期可以切换上一月和下一月 组件…...
直播音频解决方案
音频解决方案公司具体解决的是什么样的问题?什么样的客户需要找音频方案公司?相信还是有很多人不是很了解。音频解决方案公司工作就像是为音频设备“量身定制衣服”,帮助客户解决各种音频相关的问题。无论你是音响制造商、会议设备商、耳机品…...
Git基本用法总结
设置全局用户名 git config --global user.name xxx #设置全局用户名 设置全局邮箱地址 git config --global user.email xxxxxx.com #设置全局邮箱地址 查看所有的 Git 配置,包括用户信息 git config --list #查看所有的 Git 配置,包括用户信…...
SQLite的入门级项目学习记录(四)
性能评估和测试 规划项目 1、框架选择:前端交互和线程控制用pyside,SQLite作为数据库支持。 2、预估数据量:每秒10个数据,每个月约26000000(26M)条。 3、压力测试:首先用python脚本创建一个数据…...
Docker工作目录迁移
文章目录 前言一、迁移步骤1.停掉docker服务2.创建存储目录3.迁移docker数据4.备份5.添加软链接6.重启docker服务,测试 总结 前言 安装docker,默认的情况容器的默认存储路径会存储系统盘的 /var/lib/docker 目录下,系统盘一般默认 50G&#…...
【多维动态规划】64. 最小路径和(面试真题+面试官调整后的题目)
64. 最小路径和 难度:中等 力扣地址:https://leetcode.cn/problems/minimum-path-sum/description/ 1. 原题以及解法 1.1 题目 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和…...
Web后端开发技术:RESTful 架构详解
RESTful 是一种基于 REST(表述性状态转移,Representational State Transfer)架构风格的 API 设计方式,通常用于构建分布式系统,特别是在 Web 应用开发中广泛应用。REST 是一种轻量级的架构模式,利用标准的 …...
【Fastapi】参数获取,json和query
【Fastapi】参数获取,json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说,懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…...
【Node.js】初识微服务
概述 Node.js 的微服务架构是一种通过将应用程序分解为独立的、松耦合的小服务的方式进行系统设计。 每个微服务负责处理一个特定的业务功能,并且这些服务可以独立开发、部署、扩展和管理,并且可以通讯。 它的核心思想就是解耦。 微服务和微前端是类…...
SpringBoot + MyBatis-Plus项目实战:从零搭建一个JavaEE课程设计骨架(附完整源码结构解析)
SpringBoot MyBatis-Plus项目实战:从零搭建一个JavaEE课程设计骨架(附完整源码结构解析) 当你第一次打开IDE准备开始JavaEE课程设计时,面对空白的项目窗口是否感到无从下手?本文将带你从零开始,用SpringBo…...
Java八股文实践篇:从理论到DeOldify项目中的设计模式应用
Java八股文实践篇:从理论到DeOldify项目中的设计模式应用 每次面试被问到设计模式,是不是都只能背出“单例模式确保一个类只有一个实例”这样的标准答案?背得滚瓜烂熟,但一上手写代码,还是觉得这些模式离自己很远&…...
别再看水刊了!智能故障诊断领域投稿,这20+个SCI期刊才是你的目标(附避坑指南)
智能故障诊断领域投稿指南:20高价值SCI期刊与避坑策略 对于从事智能故障诊断研究的学者而言,选择合适的SCI期刊投稿是研究成果获得认可的关键一步。本文将系统梳理该领域的优质期刊资源,帮助您避开常见陷阱,提高投稿成功率。 1. 智…...
Reaxys没权限?试试这个国产化学数据库MolAid:免费注册+中文界面实操指南
Reaxys没权限?试试这个国产化学数据库MolAid:免费注册中文界面实操指南 在化学研究领域,获取高质量的化合物数据是实验设计和论文写作的基础。然而,许多国际知名数据库如Reaxys需要机构订阅才能使用,这让独立研究人员和…...
千问3.5-2B轻量化部署教程:边缘设备适配可能性分析与CPU回退方案说明
千问3.5-2B轻量化部署教程:边缘设备适配可能性分析与CPU回退方案说明 1. 模型简介 千问3.5-2B是Qwen系列中的小型视觉语言模型,专为边缘计算场景优化设计。这个2B参数量的版本在保持视觉理解能力的同时,大幅降低了硬件需求。 模型核心能力…...
cool-admin(midway版)数据库事务超时:超时设置与回滚机制终极指南
cool-admin(midway版)数据库事务超时:超时设置与回滚机制终极指南 【免费下载链接】cool-admin-midway 🔥 cool-admin(midway版)一个很酷的后台权限管理框架,模块化、插件化、CRUD极速开发,永久开源免费,基于midway.js…...
Mermaid Live Editor终极指南:10个团队协作和项目管理的实用技巧
Mermaid Live Editor终极指南:10个团队协作和项目管理的实用技巧 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-l…...
Qwen3.5-9B-AWQ-4bit惊艳效果:多对象复杂场景图中主次关系与逻辑推断展示
Qwen3.5-9B-AWQ-4bit惊艳效果:多对象复杂场景图中主次关系与逻辑推断展示 1. 模型能力概览 千问3.5-9B-AWQ-4bit是一款突破性的多模态AI模型,它能够像人类一样"看懂"图片并做出智能分析。不同于传统图像识别工具,这个模型最令人惊…...
renren-fast-vue系统配置中心使用指南:灵活配置与动态切换
renren-fast-vue系统配置中心使用指南:灵活配置与动态切换 【免费下载链接】renren-fast-vue renren-fast-vue基于vue、element-ui构建开发,实现renren-fast后台管理前端功能,提供一套更优的前端解决方案。 项目地址: https://gitcode.com/…...
PakePlus云打包入门指南:从零到一的GitHub Token配置与安全实践
PakePlus云打包入门指南:从零到一的GitHub Token配置与安全实践 【免费下载链接】PakePlus Turn any webpage/HTML/Vue/React and so on into desktop and mobile app under 5M with easy in few minutes. 轻松将任意网站/HTML/Vue/React等项目构建为轻量级(小于5M)…...
