Qt信号槽——传递自定义数据类型

2023-11-06

Qt信号槽——传递自定义数据类型

Qt的信号槽机制支持传递int,short,double等C语言的基本类型的变量,也可以传递Qt自己的数据类型。但是在传递用户自己定义的数据类型,或其他数据类型是需要进行注册的。

原因:当一个signal被放到队列(queued)中时,它的参数(arguments)也会被一起放到队列中。这就意味着参数在被传送到slot之前不仅要被拷贝,存储在队列(queue)中。为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象,而为了让Qt知道怎么去做这些事情,参数的类型需要使用qRegisterMetaType来注册。

参考以下文档: (不得不说Qt的文档是真的好,基本所有问题都可以查看文档解决)

Qt文档:QMetaType Class | Qt Core 5.15.11

原文链接:Qt信号槽机制-传递自定义数据类型(qRegisterMetaType)_宁静致远2021的博客-CSDN博客_qt信号槽传递自定义类型

原文链接:Qt信号槽传递自定义结构体_Liu-Eleven的博客-CSDN博客_qt信号槽传递自定义结构体

1. 方法一

1.1 步骤

  1. 自定义一种类型,在这个类型所在文件包含头文件:#include <QMetaType>

  2. 在类型定义完成后,声明自定义类型:Q_DECLARE_METATYPE(Type)

 // This example shows a typical use case of Q_DECLARE_METATYPE():
 struct MyStruct
 {
     int i;
     ...
 };
 ​
 Q_DECLARE_METATYPE(MyStruct)

3.在main()函数中注册自定义类型:template <typename T> int qRegisterMetaType(const char *typeName);

 // This example registers the class MyClass:
 ​
 qRegisterMetaType<MyClass>("MyClass");

如果还希望使用这种类型的引用,还需要注册:qRegisterMetaType<MyClass>("MyClass&");

此方法可以直接在信号槽中使用自己定义的数据类型。

1.2 例程-传递自定义类

 // 1.包含头文件
 #include <QMetaType>     
 //必须包含QMetaType,否则会出现下面错误:     
 //error: expected constructor, destructor, or type conversion before ‘;’ token     
 #include <QString>
 ​
 // 2.自定义类型
 class MyClass
 {
 private:     
     int _count;     
     QString _text;
 public:     
     MyClass();     
     MyClass(int, QString);     
     int count();     
     QString text();       
 };
 ​
 // 3.声明自定义类型
 //在自定义类或者结构体等声明后紧接着用宏Q_DECLARE_METATYPE声明自定义自定义数据类型   
 Q_DECLARE_METATYPE(MyClass)
 
// 4.在main()函数中注册
 int main(int argc, char *argv[])
 {
     qRegisterMetaType<MyClasst>("MyClass");
     qRegisterMetaType<MyClasst>("MyClass&");
 ​
     QApplication a(argc, argv);
     Form w;
     w.show();
 ​
     return a.exec();
 }

2. 方法二

第二种方法是通过QVariant类型进行转换。

参考文档:QVariant Class | Qt Core 5.15.11

2.1 例程-传递自定义结构体

2.1.1 定义结构体并注册元对象

// 1.定义结构体
 typedef struct student
 {
     int     m_id;
     int     m_age;
     QString m_name;
 } student_t;
 ​
 // 2.注册元对象
 Q_DECLARE_METATYPE(student_t)
     
 class MainWindow : public QMainWindow
 {
     Q_OBJECT
         
 public:
     explicit MainWindow(QWidget *parent = 0);
     ~MainWindow();

 private slots:
     void slot_recvStudent(const QVariant varValue);
     
 signals:
     void signal_sendStudent(const  QVariant varValue);
 }

2.1.2 连接信号槽

connect(this, SIGNAL(slot_recvStudent(const QVariant)), this, SLOT(signal_sendStudent(const  QVariant)));

2.1.3 使用QVariant打包数据并发送

student_t iStudent;
 ​
 iStudent.m_id   = 1;
 iStudent.m_age  = 18;
 iStudent.m_name = "Box";
 ​
 QVariant varValue = QVariant::fromValue(iStudent);
 emit signal_sendStudent(varValue);

2.1.4 在槽函数中解包并打印

void MainWindow::slot_recvStudent(const QVariant varValue)
 {
     if (varVlaue.canConvert<student_t>())
     {
         student_t student = varValue.value<student_t>();
         qDebug() << "ID : " << student.m_id;
         qDebug() << "Age : " << student.m_age;
         qDebug() << "Name : " << student.m_name;
     }
 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt信号槽——传递自定义数据类型 的相关文章

随机推荐

  • 使用arcgis修改行政区划图边界

    打开ArcMap 我的是10 8版本的 1 添加行政区划图数据 文件 添加数据 添加数据 弹出添加数据框 点击红色框中的按钮 连接到数据所在文件夹 选择要处理的数据 添加 不便放入整体规划图 放大后选取部分作为示例 本次处理目的是把红色框中
  • 3d散列点云的曲率的求法

    1 取某个区域内的n个最近邻点根据局部抛物面拟合公式 z x y Ax 2 By 2 Cxy Dx Ey F 用最小二乘法可求出上面的各个系数 即可求得空间曲面函数的系数 2 根据公式 Km A 1 E 2 B 1 D 2 CDE 1 D
  • 合宙Air105

    基础资料 基于Air105开发板 Air105 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方Socket网络接口demo中DTU连接示例 dtu demo lua 进行复现及分析 进行用阻塞方式做串口透传DTU内
  • 数据资源丨原始数据哪里找?这些网站要用好!(建议收藏)

    资料搜集是个相当繁琐与累的工作 也是投资入门的基本 良好的信息资料搜集能力有利于我们快速了解投资主体的基本情况 为后续的调研及一手资料的获得打下较好的基础 目录 一 搜索引擎 重点掌握 1 搜索关键字的选择 2 搜索技巧 3 搜索引擎推荐
  • pptp流量分析之搭建pptp测试服务器

    1 前言 最近研究常见vpn流量协议 需要产出检测规则对此类流量进行检测 遂需要搭建测试环境抓取测试流量 简单记录一下 2 环境准备 1 ubuntu22 04 服务器 2 win11 客户机 3 安装及配置 3 1 ubuntu服务器安装
  • 高通平台USB 2.0和USB 3.0接口充电器识别原理

    1 BC 1 2 1 1 充电器类型探测 1 DCD DP上有150mV 10uA x 15K欧姆下拉电阻 的电压 DM上电压为0 2 Primary Det DP发起检测DM DP上加载0 6V电压 DM上电压为0 充电器类型是SDP D
  • Pikachu漏洞靶场的简介、下载与安装

    文章目录 简介 下载 安装 简介 pikachu是一个漏洞练习平台 其中包含了常见的web安全漏洞 Burt Force 暴力 漏洞 XSS 跨站脚本漏洞 CSRF 跨站请求伪造 SQL Inject SQL注入漏洞 RCE 远程命令 代码
  • [WSL-1-Ubuntu]使用oh-my-zsh美化你的WSL(附脚本)

    在腾讯云买的那个1c2g的服务器 想用mycat搭建一个mysql cluser 用docker部署了一主一从内存就没了一半 可一主一从没啥作用 起码也得2主2从吧 而且还有HA呢 但内存和钱包不给力 所以就想到WSL这个方案 在开wsl这
  • 发现1个拿来即用的Python高级脚本,收藏!

    今天 给大家推荐一些用Python爬虫做私活的渠道 先给各位还不熟悉Python爬虫的朋友介绍一下 可以短时间获得大量资料 可以进一步数据分析 当然也可以获得收益 学会Python爬虫以后 还可以通过各种渠道 网站接单 接单群 私人介绍 接
  • 今日头条信息流广告怎么做?(今日头条信息流广告费用解析)

    国内的各种渠道千千万 主流的广告平台不算多也不算少 而今日头条与其它平台最大区别在于 个性化推荐和智能分发 可以简单理解为 今日头条上投放的广告 是通过 机器人代码 过滤再分发出去的 因此了解 机器人 在分发过程中遵循的规则 随着网络的发展
  • pytorch: RuntimeError: DataLoader worker (pid(s) 27292) exited unexpectedly

    厉害了 用win10特有的bug 搞半天 就是把pytorch下dataloader的其中一个num workers参数注释掉 可能是win10只有一个thread的原因 torch utils data DataLoader self d
  • 同一套服务如何应对不同终端的需求——服务适配

    经过前几个章节的实践 会员已可以绑定手机号 更新个人信息 绑定个人车辆信息 开通月卡 签到等功能 下面从客户端查看自己的数据入手 再聊聊服务调用的问题 简单处理 我们已经将用户数据进行垂直拆分 分布在不同数据库中 当客户端数据展现时 就需要
  • 参加2012中国数据库技术大会大会有感

    上周末参加了 DTCC Database Technology Conference China 2012中国数据库技术大会 见到了很多熟人 开了3天 好多议题 我去了后两天 第一天是周五 没好意思向公司请假 干货还是很多的 比某些扯淡的行
  • 代理服务器(Proxy)

    目录 1 什么是代理服务器 2 代理服务器的作用 3 代理服务器的工作流程 4 安装代理服务器软件及配置文件解析 squid 5 正向代理 6 修改数据存放位置 7 设置磁盘使用阈值 代理 两字顾名思义就是以代理人的身份去帮助其他人取得所需
  • C++数组:发工资

    题目描述 财务处要给公司的n位员工发工资了 请你帮助计算最少要多少张人民币才能给每位员工发工资而不必找零呢 已知人民币的面额为100元 50元 10元 5元 2元和1元这6种 输入格式 第一个值为正整数n 后面接着n个正整数表示n位员工的工
  • Python天文数据处理——Astropy

    前言 Astropy是一个用于天文数据处理的Python包 它包含了许多常用的天文学函数和工具 可以用于处理 分析和可视化各种类型的天文数据 Astropy最新版本是v4 3 官网地址为https www astropy org Astro
  • Django计算机毕业设计个性化大学生图书推荐系统(程序+LW)Python

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行 环境配置 Pychram社区版 python3 7 7 Mysql5 7 HBuilderX list pip Navicat11 Django nodejs 项目技
  • Linux进行AES加密每次结果都不一致并且解密失败报错

    1 现象 windows操作系统下进行 123456 的AES加密 encrypted message is below QLNYZyjRnKF zxAjzDt lw decrypted message is below 123456 阿里
  • [数值分析拟合]Matlab三次样条插值拟合数据

    三次样条插值是一种运用极为广泛的工程插值算法 本文章编写的函数默认使用端点处的导数值代替给定的两端点的导数值使用三转角构造法进行插值 该函数也可传入端点导数数值进行分析 对数据进行方便而迅速的拟合 但是目前没有三弯矩构造法 一 三次样条插值
  • Qt信号槽——传递自定义数据类型

    Qt信号槽 传递自定义数据类型 Qt的信号槽机制支持传递int short double等C语言的基本类型的变量 也可以传递Qt自己的数据类型 但是在传递用户自己定义的数据类型 或其他数据类型是需要进行注册的 原因 当一个signal被放到