Qt中的中信号槽与异步调用

2023-11-10

Qt中使用信号-槽机制处理跨对象之间的调用,该机制的好处有:
1. 使得调用关系的绑定和解除十分灵活,不必修改类成员函数代码
2. 在不暴露更多全局变量的情况下实现跨命名空间调用
3. 可以多个信号对应多个槽,也可以信号之间绑定,对应于GUI中的逻辑很方便
4. 利用Qt::QueuedConnection可以实现异步调用

一般使用

connect(this, SIGNAL(TestSignal()), this, SLOT(TestSlot()), Qt::AutoConnection)

第四个参数一般省略


以下详细谈谈第4点:

对于一个多线程GUI程序来说,经常遇到的需求是后台有比较复杂的IO、网络、数据处理逻辑,响应的业务逻辑有多个状态,并常伴有延时。这种情况下用多线程处理比用定时器方便。而一旦使用多线程,就涉及到与GUI主线程的同步问题。
从开发者的角度,希望使用的是“线程透明”的交互机制,即直接跨线程修改GUI控件属性;GUI中用户的输入事件传递到数据处理线程中,并在适当时被响应和处理。
我们希望图形库提供以上封装好的方法,不需要开发者手动处理互斥锁、消息队列等。
Qt做到了

在Qt中使用

connect(obj1, SIGNAL(TestSignal()), obj2, SLOT(TestSlot()), Qt::QueuedConnection);

跨越对象异步调用信号-槽。注意在obj2中必须调用消息循环

void processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents)

这是因为,Qt异步信号槽机制内部基于Event,必须由QObject内置的事件响应函数处理到来的事件,并实际执行槽函数。


Qt中的主要使用以下函数发送消息:

//添加消息到队列末尾
void ​postEvent(QObject * receiver, QEvent * event, int priority = Qt::NormalEventPriority)

//添加消息到队列开头
bool QCoreApplication::​sendEvent(QObject * receiver, QEvent * event)

可以用来发送Qt预定义事件,比如模拟鼠标点击。也可以自定义事件,自定义事件对应ID要大于1024。

一般而言,我们自定义事件的目的本质上是为了远程调用,故直接使用异步信号槽机制即可。除非需要对于传递的数据进行复杂的存储管理,此时再考虑继承Event包含对应数据结构。


以下代码表明,不调用消息循环就无法处理异步信号槽

//test.h
class AsynchronizedSlotTest : public QObject
{
    Q_OBJECT
public:
    AsynchronizedSlotTest();
    void runTest();

    public slots :
        void TestSlot();
signals:
    void TestSignal();
};
//test.cpp

AsynchronizedSlotTest::AsynchronizedSlotTest() : QObject()
{
    //connect(this, SIGNAL(TestSignal()), this, SLOT(TestSlot()), Qt::AutoConnection);
    connect(this, SIGNAL(TestSignal()), this, SLOT(TestSlot()), Qt::QueuedConnection);

}
void AsynchronizedSlotTest::runTest()
{
    emit TestSignal();
}

int main()
{
    AsynchronizedSlotTest slotTest;
    slotTest.runTest();
    return 0;
}

将第6行改成第5行就可以,因为此时Qt::DirectConnection直接调用不依赖消息循环

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

Qt中的中信号槽与异步调用 的相关文章

  • QGroupBox边框

    经过一段时间的搜索后 我发现在组框上设置可见边框的方法是使用 StyleSheet 属性 我补充道 border 2px solid gray 但有几个问题 1 组框内的所有内容也继承此设置 2 边框在标题附近有一个小洞 碎片缺失 Here
  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • 检查目录是否为空

    我正在尝试检查目录是否为空 MainWindow MainWindow QWidget parent QMainWindow parent ui new Ui MainWindow ui gt setupUi this QDir Dir h
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但

随机推荐

  • android 腾讯微博开发 OAuth认证(一):获取请求指令RequeToken

    第一步 下载腾讯微博SDK 第二步 创建Android项目 并配置Build Path 加入SDK中httpmime 4 1 3 jar Android SDK v1 2 jar的源文件 里面包含错误需要自己进行相关的修改 两个库文件 相关
  • STM32开发实例 基于STM32单片机的智能机房系统

    一 系统设计 由 STM32F103C8T6单片机最小系统 DHT11温湿度传感器 ACS712测电流模块 MO 2烟雾传感器 ESP8266无线传输模块 可以通过RSP8266将温湿度值 烟雾浓度值 测得电流值显示到上位机 在上位机可以调
  • orange's一个操作系统的实现的前五章文件组织整理

    Orange s一个操作系统的实现的前五章文件组织整理 Tree Makefile a img 虚拟软盘 bochsrc bochs虚拟机配置 boot boot asm 编译为boot bin文件后被BIOS加载到内存 然后在a img中
  • CentOS7编译安装Nginx(Openresty)

    环境准备 yum y install automake autoconf libtool make gcc gcc c gcc g77 readline devel pcre devel openssl devel tcl perl lib
  • ABP.io 迁移数据库遇到的BUG

    文章目录 项目描述 1 Your startup project AbpDemo Application doesn t reference Microsoft EntityFrameworkCore Design 2 An error o
  • idea隐藏文件或文件夹

    strings gt Editor gt File Types gt Ignored Files and Folders中添加要隐藏的文件或文件夹 支持通配符
  • 【netty】Netty粘包问题TooLongFrameException: Adjusted frame length exceeds

    文章目录 1 概述 1 概述 此问题参考 Flink Flink 任务报错 akka remote connection TooLongFrameException adjusted frame length discarded 我这里主要
  • 边缘计算概念以及应用

    什么是边缘计算 边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和IT环境服务 边缘计算的目标是在靠近数据输入或用户的地方提供计算 存储和网络带宽 边缘计算 是一种分散式运算的架构 在这种架构下 将应用程序 数据资料与服务的运算
  • R语言之词云:wordcloud&wordcloud2安装及参数说明

    一 wordcloud安装说明 install packages wordcloud 二 wordcloud2安装说明 install packages devtools devtools install github lchiffon w
  • 心电信号越界怎么回事_心电图机的干扰及其正确处理方法

    心电图机是记录人体体表各点随时间而变化的心电波形的医疗仪器 医生根据心电图机所记录的波形的形态 波幅大小以及各波之间的相对时间关系来鉴别诊断心脏疾病 因此 心电图机所记录的心电图的精确度对于心脏疾病的鉴别诊断至关重要 但是 由于心电信号比较
  • JAVA面试常考

    1 自我介绍 讲下最有难度的项目 2 对线程安全的理解 3 比如有一个局部变量i 1 两个线程同时执行 是否线程安全 4 比如再有一个共享变量 如何保证线程安全 5 说说ThreadLocal 底层如何实现 6 hashmap实现原理 7
  • 【BATCHNORMALIZATION、LAYERNORMALIZATION、INSTANCENORMALIZATION和GROUPNORMALIZATION】

    总览 神经网络中有各种归一化算法 Batch Normalization BN Layer Normalization LN Instance Normalization IN Group Normalization GN 从公式看它们都差
  • ServerSocket 的建立与使用(多线程)

    1 main方法 package peixun public class MyServerSocket public static void main String args new ServerListener start 2 建立连接
  • 多元线性回归的梯度下降

    目录 1 线性回归的基本概念 2 线性回归算法 3 多元梯度下降算法 4 总结 1 线性回归的基本概念 在回归分析中 如果只包含一个自变量和一个因变量 且二者关心可近似用一条直线表示 则称该回归分析为一元线性回归分析 如果包含两个及两个以上
  • 多模态(图像和文本跨模态)分类

    文章目录 前言 一 数据集介绍 二 处理过程 1 处理图片文本标签数据 1 将label由消极 中立 积极的标签变成数字 0 1 2 并且将其保存在path2label字典中 2 分别将图像文件和文本文件形成列表 3 分别将文本内容 对应的
  • 计算机插本2a院校,广东省专插本2A院校有哪些

    满意答案 yandianhua 2012 12 23 采纳率 45 等级 12 已帮助 15307人 晨光英语考试团很荣幸为您解答 2011年广东省本科插班生招生院校名单 院校代码 院校名称 以下院校是2A线的 533 深圳大学 534 五
  • 刷题之455. 分发饼干 -----贪心初试

    假设你是一位很棒的家长 想要给你的孩子们一些小饼干 但是 每个孩子最多只能给一块饼干 对每个孩子 i 都有一个胃口值 g i 这是能让孩子们满足胃口的饼干的最小尺寸 并且每块饼干 j 都有一个尺寸 s j 如果 s j gt g i 我们可
  • 性能测试浅谈

    早期的性能测试更关注后端服务的处理能力 一个用户去访问一个页面的请求过程 如上图 数据传输时间 当你从浏览器输入网址 敲下回车 开始 真实的用户场景请不要忽视数据传输时间 想想你给远方的朋友写信 信件需要经过不同的交通运输工具送到朋友手上
  • 去除移动端h5的横向滚动条

    我的问题是 在移动端第一次访问h5页面时 页面尺寸被放大了一点 没有手机适配 所以出现了横向滚动条 手指缩小页面尺寸后 横向滚动条才消失 解决方案 在入口页面index html的标签里添加下面一行代码
  • Qt中的中信号槽与异步调用

    Qt中使用信号 槽机制处理跨对象之间的调用 该机制的好处有 1 使得调用关系的绑定和解除十分灵活 不必修改类成员函数代码 2 在不暴露更多全局变量的情况下实现跨命名空间调用 3 可以多个信号对应多个槽 也可以信号之间绑定 对应于GUI中的逻