Qt 事件和信号/槽

2023-12-12

在Qt世界中,事件和信号/槽有什么区别?

一个会取代另一个吗?事件是信号/槽的抽象吗?


在 Qt 中,信号和事件都是观察者模式。它们用于不同的情况,因为它们有不同的优点和缺点。

首先,让我们准确定义“Qt 事件”的含义:Qt 类中的虚函数,如果您想处理事件,则需要在您的基类中重新实现该函数。这与模板方法模式.

请注意我如何使用“handle事实上,信号和事件的意图之间有一个基本区别:

  • You "handle" events
  • You "得到通知“ 信号发射

不同之处在于,当您“处理”事件时,您有责任以在课堂之外有用的行为来“响应”。例如,考虑一个具有带有数字的按钮的应用程序。该应用程序需要让用户聚焦按钮并通过按“向上”和“向下”键盘键来更改数字。否则按钮应该像普通按钮一样工作QPushButton(可以单击等)。在 Qt 中,这是通过创建您自己的小可重用“组件”(QPushButton),它重新实现QWidget::keyPressEvent。伪代码:

class NumericButton extends QPushButton
    private void addToNumber(int value):
        // ...

    reimplement base.keyPressEvent(QKeyEvent event):
        if(event.key == up)
            this.addToNumber(1)
        else if(event.key == down)
            this.addToNumber(-1)
        else
            base.keyPressEvent(event)

看?这段代码提出了一个新的抽象:一个像按钮一样的小部件,但具有一些额外的功能。我们非常方便地添加了这个功能:

  • 由于我们重新实现了虚拟,我们的实现自动封装在我们的类中。如果 Qt 的设计师做了keyPressEvent一个信号,我们需要决定是否继承QPushButton或者只是外部连接到信号。但这是愚蠢的,因为在 Qt 中你是always期望在编写具有自定义行为的小部件时继承(有充分的理由 - 可重用性/模块化)。所以通过制作keyPressEvent一个事件,他们表达了他们的意图keyPressEvent只是功能的基本构建块。如果它是一个信号,它看起来就像是一个面向用户的东西,但实际上它并不是这样的。
  • 由于该函数的基类实现可用,因此我们可以轻松实现责任链模式通过处理我们的特殊情况(向上和向下键)并将其余的留给基类。你可以看到这几乎是不可能的,如果keyPressEvent是一个信号。

Qt 的设计经过深思熟虑 - 他们创造了我们掉进成功的深渊通过使做正确的事情变得容易而做错误的事情变得困难(通过使 keyPressEvent 成为一个事件)。

另一方面,考虑最简单的用法QPushButton - 只需实例化它并在单击时收到通知:

button = new QPushButton(this)
connect(button, SIGNAL(clicked()), SLOT(sayHello())

这显然是由user班级:

  • 如果我们必须子类化QPushButton每次我们想要某个按钮来通知我们单击时,这都需要很多子类无缘无故!始终显示“Hello world”的小部件messagebox单击时仅在单一情况下有用 - 因此它完全不可重复使用。同样,我们别无选择,只能做正确的事情 - 通过外部连接。
  • 我们可能想连接几个插槽clicked()- 或将多个信号连接到sayHello()。有了信号就没有大惊小怪。对于子类化,您必须坐下来思考一些类图,直到决定合适的设计。

注意其中一个地方QPushButton emits clicked()是在其mousePressEvent()执行。这并不意味着clicked() and mousePressEvent()是可以互换的——只是它们是相关的。

因此,信号和事件具有不同的目的(但相关之处在于两者都允许您“订阅”正在发生的事情的通知)。

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

Qt 事件和信号/槽 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 如果 OpenProcess() 因 ACCESS_DENIED 失败,如何从 pid 获取进程文件名?

    我正在尝试从其 pid 获取进程名称 用户以管理员身份运行 UAC 已启用 但未提升 一些系统进程 例如services exe 以这样的方式设置他们的安全性OpenProcess PROCESS QUERY INFORMATION 失败了
  • postgresql 触发器:禁用自动提交并设置隔离级别

    我正在数据库上编写一个触发器 而不是在表上插入 进行一些操作 然后将数据插入到不同的相关表中 现在我需要禁用自动提交并在触发器内设置不同的隔离级别 我该怎么办 除了嵌入式 SQL 之外 PostgreSQL 没有禁用自动提交的设置 如果您尝
  • 致命错误:未捕获错误:未找到“Cloudinary”类

    当我尝试在 cloudinary 中上传图像时 致命错误 未捕获错误 未找到 Cloudinary 类 我的配置文件中出现此错误 我的配置文件包含 为什么我会得到这个 05 2021 我希望你找到了解决方案 如果没有尝试这个 Cloudin
  • 我可以在 Google 跟踪代码管理器中添加 Facebook 转化跟踪吗?

    我会在 Google 标签管理中添加 Facebook 转化跟踪像素 我看到的唯一问题是 FB 要求在标签之间添加代码 而 GTM 则位于 有点令人困惑 有任何想法吗 FB 转换跟踪代码应介于 and 正确部署Google Tag Mana
  • 如何参数化 Pytest 夹具?

    考虑以下 Pytest import pytest class TimeLine object instances 0 1 2 pytest fixture def timeline return TimeLine def test tim
  • 使用 OpenXML 将 PowerPoint 演示文稿另存为 PDF

    我的目标是建立一个自动化的服务器端流程来转变 ppt into a pdf Microsoft 自己建议我使用 OpenXML 现在我正在考虑这一点 我的问题是 我真的可以使用 OpenXML 实现我的目标吗 我很难找到我期望的方法 例如
  • 优化 pyomo 中的 Fortran 函数

    我希望使用 Pyomo 优化 Fortran 函数 目标函数和约束都是用 Fortran 编写的 根据给出的答案here 我们可以用ExternalFunction表达式对象 但即使是最简单的函数我也无法得到结果 下面给出的是一个可重现的示
  • C 编程中 gets、scanf 和 fgets 之间的区别[重复]

    这个问题在这里已经有答案了 我最近开始学习C编程语言 并在三本不同的书中看到了这三个输入函数 因此 当考虑到效率时 我对使用哪一个有点困惑 因此 当考虑到效率时 我对使用哪一个有点困惑 没有一个 I O 速度慢 如果需要效率 就不要进行 I
  • Firebase Firestore 适用于真实数据库,但不适用于模拟器

    我正在使用 Firebase 并开始尝试使用 Firebase 模拟器运行本地开发实例 我正在运行 Firebase Tools v8 4 1 当我使用真正的 Firestore 数据库运行时 一切正常 然而 当我使用模拟器时 出现了一些问
  • auto_ptr 与 swig

    我正在尝试包装一个使用 auto ptr 的 C 库 我正在使用痛饮 并想要生成 python 绑定 我看过 swig 文档中关于如何将 swig 与智能指针一起使用的部分here 但我无法让它发挥作用 Swig 生成想要使用 const
  • pascal 中使用的集合的实现是什么?

    我想知道语言提供的 pascal 中集合类型的实际实现 特别是 我想知道 freepascal 运行时库中使用的库 但我对任何 pascal 实现都很感兴趣 我关心它的运行时复杂性 的最佳实现不相交集数据结构 are in O log n
  • 如何将 Mapbox SDK 与 SwiftUI 集成

    我将 Mapbox SDK 安装到我的项目中 但我不明白如何将此代码片段与SwiftUI 我创建了一个 SwiftUIView named MapView 我在其中导入 Mapbox 框架 我尝试使用UIViewRepresentable协
  • MySQL LEFT JOIN 3 个表

    我有3张桌子 Persons PersonID Name SS Fears FearID Fear Person Fear ID PersonID FearID 现在我想列出每个与他们相关的恐惧的人 可以是多种恐惧 也可以没有 即使一个人没
  • 为什么 com.typesafe.slick#slick_2.11;2.0.2: not find 出现 UNRESOLVED DEPENDENCIES 错误?

    我正在尝试从类型安全激活器运行 hello slick 示例 当我输入 run 时 我在 sbt 中创建一个项目 它给出了以下错误 warn warn UNRESOLVED DEPENDENCIES warn warn com typesa
  • 循环遍历文件以计算字段数

    我有一个 bash 脚本来从 txt 文件添加用户 这真的很简单 name firstname uid gid 空格分隔值 我想用 awk 检查每行是否包含 4 个字段 如果是我想返回1 如果不是返回0 file my file txt a
  • 谷歌地图:与用户一起顺利移动标记和地图?

    一旦用户打开该功能并直至终止它 我必须在谷歌地图中显示实时 实时用户移动位置 我已经使用下面的方法来为标记设置动画 private void animateMarker final Marker marker final LatLng to
  • ClickOnce 不遵守本地主机的安装文件夹

    我正在测试 ClickOnce 应用程序部署 我已经在我的机器上设置了一个虚拟目录 运行 IIS 我已指定http localhost SampleApplication作为 Visual Studio 的 发布 选项卡中的安装文件夹 UR
  • 在 AngularJS 中处理转换后的数据

    我有一个时间戳列表 我可以用 AngularJS 列出它们 不过我想将其列为日期字符串 这些日期字符串应该是可编辑的 完成后我也希望更新相关的时间戳 我的第一个问题是 AngularJS 以不同格式 过滤器 呈现项目并仍然具有双向数据绑定的
  • VIM 浏览器插件对文件执行命令

    我正在尝试 NERDtree 它非常酷 但我想做的是在所选文件上执行特殊命令或脚本 例如 我想突出显示树中的一个图像文件 按某个键并在原始文件中插入适当的 XHTML 标签 我有一个小脚本来进行格式化 我只需要在文件上运行它 或者在选择模块
  • Qt 事件和信号/槽

    在Qt世界中 事件和信号 槽有什么区别 一个会取代另一个吗 事件是信号 槽的抽象吗 在 Qt 中 信号和事件都是观察者模式 它们用于不同的情况 因为它们有不同的优点和缺点 首先 让我们准确定义 Qt 事件 的含义 Qt 类中的虚函数 如果您