qt-C++笔记之Q_DECLARE_METATYPE和qRegisterMetaType

news2024/11/14 20:15:47

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 的元对象系统需要额外的信息来处理这些类型。

使用方法

  1. 声明自定义类型:

    首先需要创建一个自定义类型。例如:

    class MyCustomType {
    public:
        int someValue;
    };
    
  2. 使用 Q_DECLARE_METATYPE

    在全局命名空间中使用这个宏来声明自定义类型:

    Q_DECLARE_METATYPE(MyCustomType)
    
  3. 注册类型:

    为了使 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_OBJECT

public:
    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_OBJECT

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

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

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

相关文章

《独孤九剑》游戏源码(客户端+服务端+数据库+游戏全套源码)大小2.38G

《独孤九剑》游戏源码&#xff08;客户端服务端数据库游戏全套源码&#xff09;大小2.38G ​ 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】《独孤九剑》游戏源码&#xff08;客户端服务端数据库游戏全套源码&#xff09;大小2.38G 链接: https://pan.baidu.co…

生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队指导设计、解读实验结果。

查看原文>>>生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队免费指导设计、解读实验结果、一台服务器解决您所有的分析困扰!

VLDB 2024 圆桌会议回顾:展望物联网与 AI 时代的时序数据库

回顾我们在 VLDB 2024 8 月 26 日至 8 月 30 日&#xff0c;数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 最新研发成果的三篇论文被本次大会录用&#xff08;详见&#xff1a;IoTDB 在顶级会议 VLDB 2024&#xff1a;四篇最新论文入选&#xff0c;特邀做 TPC 报告与…

6.7泊松噪声

基础概念 在OpenCV联合C中给一张图片添加泊松噪声&#xff08;Poisson Noise&#xff09;可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。泊松噪声是一种统计分布服从泊松分布的噪声&#xff0c;通常用于模拟光子计数等场景。 使用泊松噪声的场景 泊松噪声通…

【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案

人话说在前&#xff1a;这篇的内容是2022年5月写的&#xff0c;当时碰到了要批量处理数据的情况&#xff0c;但是又不知道数据为啥一直报错报错报错&#xff0c;说不允许我操作&#xff0c;最终发现是因为存在隐藏的列或行&#xff0c;于是就很无语地写了博客&#xff0c;但内容…

Codeforces Round 972 (Div. 2) E2. Subtangle Game (Hard Version)(博弈+双指针 sg函数思想)

题目 思路来源 稲葉廻代码 题解 这个题比easy version的数据范围大了比较多&#xff0c; 不能再直接dp[i][j][k]表示数组a的第i个做开始局面时&#xff0c;位置(j,k)为起点时的获胜情况了 当然你把第一维压到bitset里&#xff0c;然后前缀和优化一下&#xff0c;还是可以通…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展&#xff1a;回归与回溯 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …

Tomcat中间件常见漏洞复现

#1.CVE-2017-12615 -----Tomcat put方法任意文件写入漏洞 1.打开靶场 cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d docker ps 2.访问8080端口&#xff0c;来到靶场 3.首页进抓包&#xff0c;Tomcat允许适⽤put⽅法上传任意⽂件类型&#xff0c;但不允许jsp后缀…

redisson 延迟队列实现任务过期监听

一、需求&#xff1a; 任务超过一个小时以后&#xff0c;如果还为待执行状态&#xff0c;则自动转为结束状态。 二、实现: 创建延迟队列的监听任务RedisDelayedQueueListener&#xff0c;消费延迟队列&#xff1b;创建新增延迟队列的类&#xff0c;用于创建延迟队列&#xf…

LeetCode 热题 100 回顾17

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

HTML翻牌器:用CSS和HTML元素创造动态数字展示

HTML翻牌器&#xff1a;用CSS和HTML元素创造动态数字展示 前言 翻牌器是一种数字动态展示形式&#xff0c;在生活中常见的例如翻牌计分、翻牌时钟等。 之所以以翻牌的形式是因为其物理设计的原因使其只能滚动翻牌展示数字&#xff0c;在电子显示设备不普及时&#xff0c;使用…

PMBOK® 第六版 估算活动持续时间

目录 读后感—PMBOK第六版 目录 在项目管理中&#xff0c;尤其是在软件开发这样的复杂项目中&#xff0c;工作内容是多种多样的。从需求分析、设计、编码到测试和部署&#xff0c;每个阶段都有其独特的挑战和不确定性。 没有人能独自完成所有估算工作并做到绝对精准。估算涉及…

【Unity Shader】Special Effects(九)Vortex 旋涡(UI)

源码:[点我获取源码] 索引 Vortex 旋涡思路分析旋涡中心旋涡旋转旋涡强度旋涡动画Vortex 旋涡 旋涡效果可以将一张图像以指定点作为旋涡中心,呈顺时针旋涡动画效果,使用动画播放器: 思路分析 首先,旋涡特效的核心也即是旋转(特别是uv坐标的旋转); 在此基础上,旋涡中…

Vue(15)——组合式API②

生命周期函数 选项式组合式beforeCreate/createdsetupbeforeMountonBeforeMount mountedonMounedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmounted 父子通信 父传子基本思想&#xff1a; 父组件中给子组件绑定属性…

Vue Devtools -----一条龙安装教程 + 解决安装使用过程的一些问题

一条龙安装教程&#xff08;首次 安装看这里&#xff09; 点击下方网址 进入下载页面 安装 |Vue 开发工具 (vuejs.org)https://devtools-v6.vuejs.org/guide/installation.html 选择适合自己浏览器的版本 以Edge为例&#xff0c;点击下载即可 我以为已经下载过了&#xff0c;…

BUUCTF-MISC-数据包中的线索

下载题目文件&#xff0c;解压发现是一段流量包 使用Wireshark打开 首先过滤HTTP数据流 然后追踪HTTP数据流 通过追踪数据流可以发现 流7 当中有一段base64编码&#xff0c;我们尝试解码 base64基本特征 Base64编码只包含64个字符&#xff1a;大写字母&#xff08;A-Z&#x…

计算机网络笔记002

### 课堂讨论对话 **学生A**: 老师&#xff0c;计算机网络的组成是怎样的&#xff1f;&#x1f914; **老师**: 非常好的问题&#xff01;计算机网络主要由硬件、软件和通信协议三部分组成。我们先从硬件开始讨论吧。 **学生B**: 硬件包括哪些设备呢&#xff1f;&#x1f60…

cmd快速进入文件夹目录下

首先&#xff0c;将文件夹直接点击左键拖动至cmd窗口中&#xff0c;就可以得到目录路径。 还有就是&#xff0c;在命令行直接敲入D:或者C:就可以在磁盘之间进行转换&#xff0c;注意冒号不要丢。 再有&#xff0c;如果进入某磁盘中的一个文件夹&#xff0c;使用cd命令。路径获取…

zabbix email 告警

配置媒介、触发器动作&#xff08;动作、操作&#xff09; 为用户 定义媒体&#xff0c;比如电子邮件地址 动作 - 条件

[图解]静态关系和动态关系

1 00:00:01,060 --> 00:00:04,370 首先我们来看静态关系和动态关系 2 00:00:06,160 --> 00:00:10,040 我们要尽量基于静态关系来建立动态关系 3 00:00:11,740 --> 00:00:13,740 不能够在没有这个的基础上 4 00:00:14,220 --> 00:00:17,370 没有这个的情况下就胡…