Qt自学之路(二)-信号及槽机制

2023-11-16

1、信号与槽机制介绍

        Qt提供信号与槽机制,用于类间通信。类似于观察者模式,信号相当于主题,槽相当于观察者。但是不同于观察者模式的地方为:

(1)槽可以连接多个信号

(2)信号可以跨线程通知槽。(队列连接)

2、信号

        (1)信号通过emit命令进行发送。例如:

        (2)不需要在cpp中书写实现。moc编译器会自动生成信号的实现代码。

        (3)信号按照槽连接的顺序通知槽。

3、槽

        (1)槽是一个常规的C++成员函数。他唯一特殊的地方为:它可以和信号进行连接

        (2)槽可以直接调用。也可以通过信号槽连接进行调用。

        (3)通过信号及槽连接进行调用,将忽略槽的访问级别。也就是说即使槽是私有的,也可以被其他类的对象通过信号槽连接进行调用。

4、信号和槽的连接

        (1)qobject基类提供两种类型的连接函数:

                1)基于成员函数指针方式

                2)基于字符串方式。

        (2) 信号和槽机制是类型安全的:Qt会检测信号与槽的签名式是否一致。

                1)对于基于函数指针方式的连接,编译器在编译阶段会检测信号与槽签名式是否一致。

                2)对于基于字符串方式的连接,Qt会在程序运行时检测信号与槽签名式是否一致

        (3)信号与槽连接类型:

                1)直接连接:当信号发送时槽会立即被调用。槽在信号所在线程中执行。(发送信号语句后面的语句将在槽返回后继续执行。)

                2)队列连接:当接收信号的对象所属线程返回到消息循环队列时槽才被执行。槽将在接收信号对象所属的线程中执行。发送信号的线程不被阻塞(emit语句后面的语句将继续执行)。

                3)阻塞队列连接:与队列连接类似。不同之处在于,发送信号的线程将被阻塞,直到槽返回才解除阻塞,继续执行。(这种连接不要用于接收对象所在线程与发送信号的在线程相同的情况中)

                4)唯一连接:此连接方式可以和前面几种连接方式进行组合。 在这种连接方式下, QObject::connect()当连接已经存在时将返回false。

                5)单次触发连接:这种连接方式可以与前面几种连接方式进行组合。在这种连接方式下,当槽被调用后会自动和信号进行解绑定。

        (4)信号和槽机制的开销问题。

                与直接调用函数相比,信号与槽机制会增加额外开销,但是这种开销并不显著。通过信号与槽机制调用一个函数的开销大概为直接调用一个非虚函数开销的十倍(小于new和delete的开销)。但是信号与槽机制带来的简便性及灵活性的回馈是值得付出这种开销的。往往用户不需要十分关注这些开销问题。

5、槽在哪个线程中被调用

        学习到队列消息的时候,我有点迷惑:到底槽在哪个线程中执行?后来阅读了QThread类的说明我找到了答案。

        (1)每个QObject子类对象都属于某个线程。

        (2)默认情况,一个对象属于创建它的线程。

        (3)可通过moveToThread函数改变一个对象所属线程,前提是这个对象的父亲必须为空。

        (4)当改变一个对象的线程时,他的儿子对象所属线程也会相应被修改。

        (5)当一个对象接收到一个队列信号或者一个被投递的事件时,他的槽和事件响应函数将在对象所属线程中执行。

        (6)如果一个对象没有所属线程,或者所属线程没有消息循环,那么他将无法接收队列信号或者被投递的事件。

                

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

Qt自学之路(二)-信号及槽机制 的相关文章

  • QToolBar 的菜单延迟

    我通过制作 QAction 并向其添加 QMenu 在 QToolBar 上有一个菜单 如何消除单击图标时出现菜单之前的延迟 QToolBar myToolBar new QToolBar this QAction myAction new
  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • 如何获取 QIcon 的文件/资源​​路径

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

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何在 Qt 中以编程方式制作一条水平线

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

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS

随机推荐

  • Idea启动报错idea start failed -org.picocontainer.PicoContainer com.intellij.openapi.application.Applicat

    org picocontainer PicoContainer com intellij openapi application Application getPicoContainer ror Please refer to https
  • Android编译详解之lunch命令

    Android的优势就在于其开源 手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品 如小米 LePhone M9等 因此 在我们在对Android的源码进行定制的时候 很有必要了解下 Android的编译过程 如果你从来没有做过
  • 技术人员的赚钱之道-2:做个现代的“六化”程序员

    六化 像是一面黑夜中的灯塔 在黑暗指明方向 六化 可是现代程序员具备的能力水平 六化 也可以是程序员轻创业的方式 什么是六化 专业化 数字化 自动化 虚拟化 云化 智能化 1 专业化 专业化是程序员的基础 懂得编程或某个专业领域的技术 2
  • Ubuntu20.04 LTS 安装GCC11.2教程,包教包会!

    GCC 11 2 安装 其他版本 如9 5 12 1等都可以用同样方法编译安装 但是依赖包不一样 需要到gcc官网下载对应的依赖包和源码包 前置条件 首先把Ubuntu提供的各种构建工具都给他装上 sudo apt install buil
  • 好分数阅卷3.0_揭秘!自考阅卷的批改套路!

    距离2019年4月自考仅剩 13 天 每当考试之后有小伙伴就有这样的感受 自己感觉这次可以 及格没问题 但是最后却是差了几分 也有人说 我都抄到了标准答案 为什么是56分 56分啊 难道自考真的有所谓的过关率 阅卷老师真的有刻意在压低分数
  • C++顺序表的构建(用数组存储数据)

    这是最简单的顺序表 顺序表中的元素都存储在数组T data中 const int defaultSize 100 template
  • 3399的-mipi适应多个lcd屏显示-后续2-linux内核中的修改

    一 前提 1 rk3399核心板 2 linux4 4 19 源码 3 多个MIPI显示屏的启动序列以及显示时序 重要 4 rk3399MIPI通道0 5 接上一个uboot中的修改配置 二 内核驱动的修改 0 dts就不再给出了 请参考u
  • 【PyQT5教程】-01入门PyQT5

    PyQT介绍 1 Qt 1 1 介绍 Qt 读作 cute 是一个跨平台的C 应用程序开发框架 最初由挪威公司Trolltech 现在是Qt公司的一部分 开发 Qt提供了一系列工具和类库 用于开发图形界面应用程序 命令行工具和服务器端应用程
  • k8s v1.16设置Job ttlSecondsAfterFinished不生效

    目录 Completed的job默认不会清理 配置自动清理job ttl机制自动清理完成的job ttl controller 开启 TTLAfterFinished kube apiserver开启TTLAfterFinished kub
  • 【C++】异常

    文章目录 C语言错误处理 异常的概念 异常的使用 异常的抛出匹配原则 异常的栈展开匹配原则 异常安全 异常的重新抛出 异常规范 异常体系 C 标准库的异常体系 异常的优缺点 C语言错误处理 在C语言中 因为没有异常这个机制 所以出现错误时一
  • AD20/Altium designer——如何给元器件添加3D模型

    3D模型网站 https www 3dcontentcentral cn Browse aspx eventSource mnuFindContent 1 进入3D模型下载网站 搜索并找到自己需要的模型下载 2 AD中添加3D模型 1 打开
  • 利用Laplacian变换进行图像模糊检测

    转自 https www cnblogs com arkenstone p 7900978 html 利用Laplacian变换进行图像模糊检测 检测图片是否模糊有很多方法 这篇文章review了36种 比如FFT和variation of
  • 小白都能轻松掌握,python最稳定的图片识别库ddddocr

    本文目录 前言 测试 对比Pytesseract 使用ddddocr 简介 实战 成果 前言 在爬虫过程中 大多我们都会碰到验证码识别 它是常用的一种反爬手段 包括 滑块验证码 图片验证码 算术验证码 点击验证码 所讲的图片验证码是较简单的
  • 要跳过磁盘检查,请在5秒内按任意键如何解决

    要跳过磁盘检查 请在5秒内按任意键如何解决 电脑每次开机都出 需要做张pe启动盘 进pe系统修复c盘
  • mysql之联合查询(union)15

    1 联合查询 union 本篇是我们讲述DQL数据查询语言最后的进阶 不难 主要需要注意它的特点 即易错点即可 进阶9 联合查询 union 联合 合并 将多条查询语句的结果合并成一个结果 语法 查询语句1 union 查询语句2 unio
  • OnnxRuntime 性能调优

    OnnxRuntime 性能调优 文档的一些笔记 性能调优小工具 ONNX GO Live Tool 这玩意儿有俩docker容器来实现支持 一个优化容器和一起模型转换容器 暂时具体不清楚原理 还没来得及看 后面试试 什么执行单元 Exec
  • 01背包问题(动态规划)

    问题描述 给定n种物品和一个背包 物品i的重量是wi 其价值为vi 背包容量是c 问应如何选择装入背包中的中的物品 使得装入物品的总价值最大 问题分析 我们用m i j 表示i n的物品放入容量为j的背包里可以取得的最大价值 cw表示当前背
  • spring boot 项目打jar包,并转换exe文件

    今天学习股票小知识 自己做了一个 简便的小程序 可以查询基金方面的数据 不想每次都打开软件在开启项目 所以制作了一个exe的启动程序 当然啦 遇到了一些坑的地方 记录一下 方便后期需要的时候不用再重新踩一遍 前提 spring boot项目
  • Vue脚手架搭建及创建Vue项目

    一 什么是Vue脚手架 Vue脚手架是Vue官方提供的标准化开发工具 开发平台 它提供命令行和UI界面 方便创建vue工程 配置第三方依赖 编辑vue工程 二 Vue脚手架搭建过程 1 安装Node js 官网 Node js 中文网 2
  • Qt自学之路(二)-信号及槽机制

    1 信号与槽机制介绍 Qt提供信号与槽机制 用于类间通信 类似于观察者模式 信号相当于主题 槽相当于观察者 但是不同于观察者模式的地方为 1 槽可以连接多个信号 2 信号可以跨线程通知槽 队列连接 2 信号 1 信号通过emit命令进行发送