Qt在信号中如何发送自定义结构体,或者发送多个自定义参数

2023-10-29

  昨天调试项目时,突然发现如下消息:

QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL'
(Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().)

其中ERROR_LEVEL只是我定义的枚举类型即enum ERROR_LEVEL。然后在Qt的信号-槽函数的参数中使用了这个枚举型,在发送信号时就出现了上述警告。上面警告的大概意思是信号队列中无法使用ERROR_LEVEL类型,要使用qRegisterMetaType()注册该类型后方可使用。

  通常使用的connect,实际上最后一个参数使用的是Qt::AutoConnection类型:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )

Qt支持6种连接方式,其中3中最主要:

Qt::DirectConnection(直连方式)

  当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。(信号与槽函数关系类似于函数调用,同步执行)

Qt::QueuedConnection(排队方式)

  当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。(此时信号被塞到信号队列里了,信号与槽函数关系类似于消息通信,异步执行)

Qt::AutoConnection(自动方式)

  Qt的默认连接方式,如果信号的发出和接收这个信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与排队方式相同。

  我的项目中的确跨线程使用了ERROR_LEVEL为参数类型的信号,因此使用的应当是排队方式的信号-槽机制,出现“队列中无法使用ERROR_LEVEL类型”的警告信息就可以理解了。放狗搜了一圈,有篇文章提供了个这样的解决方案:

connect(cm, SIGNAL(sendLog(QUuid, QByteArray, bool)),
            this,SLOT(sendRes(QUuid,QByteArray,bool)));
改为:
connect(cm, SIGNAL(sendLog(QUuid, QByteArray, bool)),
            this,SLOT(sendRes(QUuid,QByteArray,bool)), Qt::DirectConnection);

这样做的确能使警告信息消失,因为Qt官方文档写了:

With queued connections, the parameters must be of types that are known to Qt's meta-object system, because Qt needs to copy the arguments to store them in an event behind the scenes.

即使用排队方式的信号-槽机制,Qt的元对象系统(meta-object system)必须知道信号传递的参数类型。这里手动改为直连方式,Qt的元对象系统就不必知道参数类型了,于是警告信息消失。但这样做是不安全的,见Qt官方文档:

Be aware that using direct connections when the sender and receiver live in different threads is unsafe if an event loop is running in the receiver's thread, for the same reason that calling any function on an object living in another thread is unsafe.

  因此,咱还是老老实实地用qRegisterMetaType()注册类型吧,见代码:

头文件:

/! \file errorlevel.h/

ifndef ERRORLEVEL_H

define ERRORLEVEL_H

/*! \enum ERROR_LEVEL

  • 错误等级的定义。通常用来在传递错误消息时标记错误的等级。

    */

enum ERROR_LEVEL

{

NORMAL,  /*!< 普通错误,通常不需要处理,可以记录或者显示错误消息。*/

CRITICAL /*!< 严重错误,需要紧急处理,如果没有妥善处理,可能导致后续操作失败。*/

};

endif // ERRORLEVEL_H

cpp文件:

/! \file errorlevel.cpp/

include “errorlevel.h”

/*! 模板函数显式实例化,注册ERROR_LEVEL到元对象系统。这样才可以在信号-槽

  • 队列里使用ERROR_LEVEL类型参数。

    */

int i = qRegisterMetaType(“ERROR_LEVEL”);

元类型注册方法受益于这篇文章。

转载自:http://www.cnblogs.com/codingmylife/archive/2010/04/30/1725139.html

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

Qt在信号中如何发送自定义结构体,或者发送多个自定义参数 的相关文章

  • 在 Qthread 中运行函数 - 应用程序将挂起

    我在 QT 内部线程方面遇到一些问题 include
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 如何使用 ClangCodeModel 插件在 QtCreator 中设置 C++ 标准?

    抱歉 如果这是一个愚蠢的问题 但我已经尝试了几乎所有的方法 现在正在用头撞墙 问题是 带有 Clang 代码模型插件的 QtCreator 4 8 0 beta for Windows 解析我的项目 为 C 98 而实际上它是 C 17 但
  • 如何在 Qt-Creator 中添加自定义构建步骤?

    构建我的应用程序后 我想将其复制到特定目录 在 Windows 7 上 自定义构建步骤 cmd exe c k copy MyPlugin dll HostApp Debug plugins 但我有错误 Can t run process
  • 将 C++ 代码(本机客户端)移植到浏览器(Web 应用程序)

    我有一个使用 Qt creator SDK 编写的 C 模块 我想将此代码移植到任何网页上运行 而不会对最终用户损害源代码 用户应该能够在任何浏览器 Chrome Firefox Safari Explorer 上看到此模块的输出 而无需安
  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添
  • 如何将flex和bison与Qt项目集成?

    我正在 git 源代码控制下使用 Qt4 制作 GUI 程序 Github页面 https github com vinayak garg dic sim 项目的一小部分需要扫描和解析 所以我想在项目中使用flex和bison 我能想到3种
  • Android 版 Qt 和 BoringSSL

    我正在开发一个基于 Qt 的 Android 应用程序 它使用 QSslSocket 下载数据 由于 Android 从 OpenSSL 转向 BoringSSL 因为依赖 OpenSSL 库的 Marshmallow Qt 程序在 And
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 在 QtCreator 中调试时如何查看 qDebug 消息

    我正在从 Eclipse CDT 带有 Qt 集成插件 过渡到 QtCreator 2 0 但仍有一件事困扰着我 QtCreator 当我在 QtCreator 中调试时 我在Application output tab直到我停止正在调试的
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • Qt QML MenuItem iconSource不显示

    我有一个非常简单的设置只是为了说明问题 import QtQuick Controls 1 4 import QtQuick Window 2 2 ApplicationWindow visible true width 640 heigh
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后

随机推荐

  • UTM安全功能部署场景——web过滤原理、url过滤

    目录 web过滤原理 网络过滤检查模式 代理模式 流模式 DNS模式 应用场景 一 组网需求 二 组网拓扑 三 配置要点 四 配置步骤 五 配置步骤 web过滤原理 网络过滤检查模式 代理模式 基于代理的检查包括流量缓冲和在决定一个行动之前
  • CSS里的style标签内为什么要加html注释符

    今天俺终于搞懂了 CSS里的style标签内为什么要加html注释符 说来惭愧啊 搞开发也有那么点时间了吧 经常看在style标签里含有这个html的注释符号 想去搞懂原因 还真没找着 上网没找到原因 可能是自己查找的方式不对吧 下面步入正
  • 【202211】国内镜像源地址

    Ubuntu Python Nodejs MySQL Git Chromium Docker Homebrew 等一系列的常用最推荐的镜像源 清华源镜像清华大学开源软件镜像站 Tsinghua Open Source Mirror 可能是最
  • anguar12里面FormControl学习

    在Angular 12中 要动态修改FormGroup 你可以使用patchValue 方法或setValue 方法 使用patchValue 方法 import Component OnInit from angular core imp
  • java内部类的作用分析

    提起Java内部类 Inner Class 可能很多人不太熟悉 实际上类似的概念在C 里也有 那就是嵌套类 Nested Class 关于这两者的区别与联系 在下文中会有对比 内部类从表面上看 就是在类中又定义了一个类 下文会看到 内部类可
  • solidity数据位置

    代码在执行前 一般会编译成指令 指令就是一个个逻辑 逻辑操作的是数据 代码 或者说业务 操作的其实是数据 非区块链中 代码操作的数据 一般会存到数据库中 在区块链里 区块链本身就是一个数据库 如果你使用区块链标记物产的所有权 归属信息将会被
  • flutter 路由配置多种跳转与传参

    main dart文件 1 引入路由跳转的页面 import package app ftr pages Page1 dart import package app ftr pages Page2 dart void main gt run
  • 常见HTTP状态码

    HTTP状态码 当浏览者访问一个网页时 浏览器会向网页所在服务器发出请求 当浏览器接收并显示网页前 此网页所在的服务器会返回一个包含HTTP状态码的信息头 server header 用以响应浏览器的请求 HTTP状态码分类 HTTP状态码
  • 【react】组件创建和交互步骤和实例

    例子来自尚硅谷react视频 相当于笔记整理 link https www bilibili com video av51174155 from search seid 11218837597275325699 要做的功能 在输入框内输入内
  • Ubuntu系统中多个版本的程序指定默认版本

    最近在编译clickhouse的过程中 遇到了操作系统默认安装了一个clang 10的版本 但编译clickhouse需要安装11版本以上的clang程序 所以就通过命令 bash c wget O https apt llvm org l
  • 3D游戏编程 homework 2

    简答题 游戏对象运动的本质是什么 在游戏中一个对象的运动都是相对于某一个坐标系的运动 实质上就是坐标的改变 通过坐标改变的速度以及方法实现各种运动 请用三种方法以上方法 实现物体的抛物线运动 方法一 使用向量计算出每个时刻球应该在的位置 再
  • 1034 有理数四则运算

    1034 有理数四则运算 20 分 本题要求编写程序 计算 2 个有理数的和 差 积 商 输入格式 输入在一行中按照 a1 b1 a2 b2 的格式给出两个分数形式的有理数 其中分子和分母全是整型范围内的整数 负号只可能出现在分子前 分母不
  • 图像直方图均衡化算法理解

    一 直方图均衡化的图像原理 直方图均衡就是让照片的灰度分布拉宽 然后图像对比度变大则变的清晰 方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽 而对像素个数少的灰度级进行缩减 从而达到清晰图像的目的 直方图 png 二 直方图
  • 6个位运算使用

    6个位运算使用 1 乘以2 2 快速计算2的n次幂 3 校验奇数还是偶数 4 交换两个变量 5 找出只出现一次的数 6 对数字加密 1 乘以2 int num 10 lt lt 1 System out println num 2 快速计算
  • Java基础七(重写与重载)

    Java基础七 重写与重载 1 重写 Override 存在于继承体系中 指子类实现了一个与父类在方法声明上完全相同的一个方法 为了满足里式替换原则 重写有以下三个限制 子类方法的访问权限必须大于等于父类方法 子类方法的返回类型必须是父类方
  • 前端技能三要素

    HTML CSS js是构建网页的三种主要技术 也被称为前端技能三要素 1 HTML 超文本标记语言 是一种使用标签 标记 描述网页的语言 结构层 是一种标记语言 2 CSS 层叠样式表 主要用于美化web页面外观 表现层 样式层 样式表语
  • 编写一个猜数字游戏程序。

    猜数字游戏的实现内容 1 电脑随机生成一个数字 1 100 2 玩家猜数字 如果玩家猜小了 就提示猜小了 如果玩家猜大了 就告提示大了 如果玩家猜对了 就提示猜对了 3 游戏每局结束后 可以选择是否继续玩或者退出 我们开始先做一个游戏主页菜
  • CGAL的64位开发环境配置

    第二次配置了 然而感觉似乎并没有占到先前一年前配置过一次的优势 从第0步就很坎坷也是醉醉的 cgal官网都进不去 不过都用最新软件配置成功还是很开心的 为此觉得写一个教程很有必要 造福后人吧 首先是VS015的安装 迷之尴尬 下载了下图这个
  • Springboot高级特性——缓存

    springboot的缓存可以让我们系统性能提升 比如每次查询数据库的时候 如果设置了缓存 那么第二次查询同一数据那便直接从缓存中取值 1 启动缓存 com quking springboot01cache Springboot01Cach
  • Qt在信号中如何发送自定义结构体,或者发送多个自定义参数

    昨天调试项目时 突然发现如下消息 QObject connect Cannot queue arguments of type ERROR LEVEL Make sure ERROR LEVEL is registered using qR