QT怎么发送带结构体数据的信号?

2023-10-27

当发送的信号是结构体时

第一步:定义一个结构体.并在包含该结构体的类里面注册该结构体,通过此方法Q_DECLARE_METATYPE(T).

第二步:作为信号输出时,不能直接传结构体,要先包装一下结构再传出去; 接收时,也要拆开包装,才能拿到数据,这里借助QVariant ;

最后一步:连接信号.

具体实例如下:

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include<QVariant>

struct SRT_STUDENT
{
    int age;
    char name[20];
};
Q_DECLARE_METATYPE(SRT_STUDENT)//注册结构体

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void sendSig();
public slots:
    void receiveSig(QVariant varValue);
signals:
    void sig_StudentInfo(QVariant varValue);//自定义的信号

};

#endif // MAINWINDOW_H

.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{   
    connect(this,SIGNAL(sig_StudentInfo(QVariant)),this,SLOT(receiveSig(QVariant)));
}

MainWindow::~MainWindow()
{
    
}

void MainWindow::sendSig()
{
    SRT_STUDENT stu;
    QVariant varValue; //QT中可以装任何数据的类
    memset(&stu, 0, sizeof(stu));
    stu.age = 20;
    strcpy(stu.name,"lili");
    varValue.setValue(stu);//把结构体添加QVariant
    for(int i=0;i<5;i++)
    {
        if(i==4)
        {
            emit sig_StudentInfo(varValue);
            break;
        }
    }
}

void MainWindow::receiveSig(QVariant varValue)
{
    SRT_STUDENT stu1;
    stu1 = varValue.value<SRT_STUDENT>();
    qDebug() << "age=" << stu1.age << "name=" << stu1.name;//age= 20 name= lili
}




如此便可以发送一个带结构体的信号了.

注意,如果您打算在队列信号和槽连接或QObject的属性系统中使用该类型(QVariant),您还必须调用qRegisterMetaType(),因为名称是在运行时解析的。即当涉及到跨线程连接时,在connect之前需要调用qRegisterMetaType()注册此结构体;就像这样使用:

    qRegisterMetaType<SRT_STUDENT>("SRT_STUDENT");    
    connect(this,SIGNAL(sig_StudentInfo(QVariant)),this,SLOT(receiveSig(QVariant)));

问题:为什么自定义类型信号槽在跨线程会报错?

因为跨线程时,当发送方信号发出时,此时接受对象所在的线程未取得控制权,所以需要发送方需要将信号放在信号队列中储存发送的参数,QT就会去构造对象,而我们定义的是自定义类型,所以需要使用qRegisterMetaType()来注册,告诉QT怎么去构造对象.

或许你会感兴趣!!!

QMetaObject::invokeMethod()使用解决界面卡住问题

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

QT怎么发送带结构体数据的信号? 的相关文章

  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 为什么 QT 设计器重新调整大小或不允许我缩小或展开小部件或按钮?

    很多时候 在使用 QT 设计器时 我发现自己需要通过缩小或扩展来调整事物的大小 每当我尝试这样做时 程序都不允许我这样做 而只是恢复到将对象放置在窗口中时给我的原始默认大小 无论我的布局如何 为什么要这样做 是否有可能改变这一点 以便我可以
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 在 Qt 中,许多插槽连接到同一信号,它们在发出信号时是否按顺序调用?

    In the Qt文件说 如果多个插槽连接到一个信号 则这些插槽将 按照它们连接的顺序一个接一个地执行 当信号发出时 但在connect 功能 设置Qt ConnectionType输入为Qt QueuedConnection意思是 当控制
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 使用 QNetworkAccessManager 的 Qt 控制台应用程序

    我正在尝试写一个Qt调用网络服务的应用程序 这是一个控制台应用程序 url 将作为命令行参数传入 我搜索了例如http程序在Qt并找到这个链接 http qt project org doc qt 5 qnetworkaccessmanag
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • CMake AUTOMOC,文件位于不同文件夹中

    我有一个简单的 CMake 项目 proj project folder a h a cpp CMakeLists txt CMakeLists txt cmake minimum required VERSION 3 2 set CMAK
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht

随机推荐

  • clickhouse系列第三篇之clickhouse客户端使用教程(1.命令行客户端连接)

    文章目录 一 客户端支持的配置项 1 配置项的配置方式 1 1 从命令行传入 1 2 配置文件 2 配置项列表 二 客户端用法 1 非交互模式 1 1 query 参数指定执行语句 1 2 query 参数和发送到stdin的数据联合使用
  • JVM -- 类加载(七)

    一 加载 将类的字节码载入方法区中 内部采用 C 的 instanceKlass 描述 java 类 它的重要 field 有 java mirror 即 java 的类镜像 如对 String 来说 就是 String class 作用是
  • 前端 报错处理(长期更新 2023.9.06)

    目录 一 ECharts 相关 1 1 Error yAxis 0 not found 1 2 Cannot read properties of undefined reading 0 1 3 Cannot read properties
  • Python编程:从入门到实践 动手试一试之8-6

    根据之前学习的返回字典先写了一版 定义函数city countyr 并定义两个形参guojia和city def city country guojia city 定义函数国家和对应的城市 C city guo guojia chen ci
  • 推荐微信小程序常用的几个UI组

    1 WeUI WeUI 是一套同微信原生视觉体验一致的基础样式库 由微信官方设计团队为微信 Web 开发量身设计 可以令用户的使用感知更加统一 包含button cell dialog progress toast article acti
  • ubuntu下安装软件的方法

    一 ubuntu下软件安装 ubuntu系统下 软件安装方法有几种 常用的方法如下 1 使用 apt 工具安装 2 deb 软件包安装 3 自己下载程序源码编译安装 4 通过 ubuntu系统自带的软件中心安装 这种方法不常用 因为一直不太
  • python中SSL/TLS认证失败的解决方案

    重装了ubuntu22 04版本的系统后 跑yolov5的train py脚本时出现以下报错 原因是本地计算机上缺少了需要的根证书 File home anaconda3 envs py37 lib python3 7 urllib req
  • PaddleGAN

    产品动态 人脸编辑神器 StyleGAN V2人脸属性编辑之年龄变换 时光穿梭机 一键实现变老变年轻 完整在线教程 视频超分SOTA算法PP MSVSR 一行命令从 马赛克 到 高清影像 完整在线教程 人脸编辑神器 StyleGAN V2人
  • 爬虫日常练习-艾图网单页面图片爬取

    文章目录 爬虫练习 分析网站 代码设计 下载图片 完整代码 爬虫练习 hello 大家好 好久不见了 无聊的网友今天开始更新关于爬虫的一些日常练习 每次学习完一个新的知识后没有多的案例给自己练习真的很不舒服 希望该系列文章能够让刚刚开始学习
  • 【Linux】调试器---gdb的使用

    文章目录 一 背景知识 二 安装gdb 三 gdb的用法 使用须知 gdb的常用指令 1 进入调试 2 退出调试操作 3 显示源代码 4 设置断点breakPoint 5 查看断点信息 禁用断点 开启断点 删除断点 6 运行程序 开始调试r
  • 开发者自述:我是怎样理解支持向量机(SVM)与神经网络的

    https www leiphone com news 201705 v10u2BOvGHEbzBpV html 写在前面 囫囵吞枣看完SVM 个人感觉如果不好好理解一些概念 或说如果知其然而不知其所以然的话 不如不看 因此我想随便写一写
  • 03MySQL数据库表练习

    第一题 1 创建数据库 mysql gt create database Market 2 创建数据表customers 在c num字段上添加主键约束和自增约束 在c birth字段上添加非空约束 mysql gt use Market
  • 二进制,八进制,十进制,十六进制相互转换的快速记忆法

    1 十进制转换为R进制 都是使用除数取余法来转换 结果按倒序来 a 十进制转换为二进制 就一直除以2 直到余数比2小 商为0为止 b 十进制转换为八进制 就一直除以8 直到余数比8小 商为0为止 c 十进制转换为十六进制 就一直除以16 直
  • 2023/09/19 qt day3

    头文件 ifndef WIDGET H define WIDGET H include
  • java String转数组

    java String转数组 String转集合 将字符串转化为数组 如果你和我一样你们公司有人这样存数据的话 这就很气人 如果用分割的方法的话 还需要去除前后两个中括号 还有两个双引号要分割 气死人 所以想要转数组例如 arr a b c
  • 解决fastjson解析List对象出现{“$ref“:“$.data[0]“}的问题

    返回数据问题 例子 List
  • Linux 实验六

    编写 段bash shell程序 保存为 program sh 完成以下输出 可循环执 please input a number 5 回 5 4 3 2 1 4 3 2 1 3 2 1 2 1 1 bin bash echo please
  • Linux网络编程:多进程实现TCP通信

    服务器端代码 TCP 通信的服务器端 多进程实现并发服务器 父进程accept 子进程用于通信 include
  • linux如何运行ipynb文件_怎么在Jupyter里打开ipynb文件

    方法一 1 在使用Anaconda集成环境安装TensorFlow时 里面自带安装 Jupyter 安装完成后 打开开始菜单找到Anaconda3 64 bit 点击Anaconda Prompt 类似windows的命令行工具 2 在命令
  • QT怎么发送带结构体数据的信号?

    当发送的信号是结构体时 第一步 定义一个结构体 并在包含该结构体的类里面注册该结构体 通过此方法Q DECLARE METATYPE T 第二步 作为信号输出时 不能直接传结构体 要先包装一下结构再传出去 接收时 也要拆开包装 才能拿到数据