Qt4_深入信号和槽

2023-11-06

信号和槽

信号和槽是Qt 编程的一个重要部分。这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来。在前几个例程中,我们已经连接了信号和槽,声明了控件自己的信号和槽,并实现了槽函数,发送了信号。现在来更深入了解这个机制。

槽和普通的c++成员函数很像。它们可以是虚函数(virtual),也可被重载(overload),可以是公有的(public),保护的(protective),也可是私有的(private),它们可以象任何c++成员函数一样被调用,可以传递任何类型的参数。不同在于一个槽函数能和一个信号相连接,只要信号发出了,这个槽函数就会自动被调用。

connect函数语法

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

sender 和receiver 是QObject 对象指针,signal 和slot 是不带参数的函数原型。SIGNALE()和SLOT()宏的作用是把他们转换成字符串。

一个信号可以连接到多个槽

connect(slider, SIGNAL(valueChanged(int)), spinBox,SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));

当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。

多个信号可以连接到一个槽

connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()),this, SLOT(handleMathError()));

任何一个信号发出,槽函数都会执行。

一个信号可以和另一个信号相连

connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)))

第一个信号发出后,第二个信号也同时发送。除此之外,信号与信号连接上和信号和槽连接相同。

连接可以被删除

disconnect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError()));

这个函数很少使用,一个对象删除后,Qt 自动删除这个对象的所有连接。

信号和槽函数必须有着相同的参数类型,这样信号和槽函数才能成功连接:

connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),this, SLOT(processReply(int, const QString &)));

如果信号里的参数个数多于槽函数的参数,多余的参数被忽略:

connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),this, SLOT(checkErrorCode(int)));

如果参速类型不匹配,或者信号和槽不存在,在debug 状态时,Qt 会在运行期间给出警告。如果信号和槽连接时包含了参数的名字,Qt 将会给出警告。

以前我们列举的例子中都是控件的信号和槽。但是信号和槽机制在QObject 中就实现了,可以实现在任何从QObject 继承的子类中。

class Employee : public QObject
{
    Q_OBJECT

public:
    Employee() { mySalary = 0; }
    int salary() const { return mySalary; }

public slots:
    void setSalary(int newSalary);

signals:
    void salaryChanged(int newSalary);

private:
    int mySalary;
};

void Employee::setSalary(int newSalary)
{
    if (newSalary != mySalary) {
        mySalary = newSalary;
        emit salaryChanged(mySalary);
    }
}

注意,只有newSalary != mySalary 时才发出salary-Changed()信号,这样避免了死循环的出现。

Qt 的Meta-Object 系统

Qt 的一个最主要的成功是对C++扩展,即把彼此独立的软件模块连接起来,而不需要模块间的任何细节。

这个机制就是Meta-Object 系统,它提供了两个关键的用途:信号和槽和introspection(内省)。

introspection 功能允许应用程序在运行时得到QObjec 它子类的“meta-information”,这对实现信号和槽是很必要的,包括全部信号和槽的列表,和类的名字。
这个机制还提供了属性(在Qt Designer 中使用)和文本翻译(国际化)支持。它们构成了QSA(Qt Script forApplication)的基础。

标准C++不提供Qt meta-object 系统需要的动态meta-information。Qt 提供了一个独立的工具moc,通过定义Q_OBJECT 宏实现到C++函数的转变。moc 是用纯c++实现的,因此可以使用在任何C++编译器中。

这个机制工作过程如下:
Q_OBJECT 声明了一些QObject 子类必须实现的内省函数:metaObject(),TR(),qt_metacall()等。

Qt 的moc 工具实现Q_OBJECT 宏声明的函数和所有的信号。

QObject 成员函数connect()和disconnect()使用这些内省函数实现信号和槽的连接。

以上这些是通过qmake,moc 和QObject 自动处理的,程序员通常不用考虑它们。

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

Qt4_深入信号和槽 的相关文章

  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • QAbstractItemModel 如何表示树?

    我仍然很难理解 QAbstractItemModel 对项目的表示 有两种返回 QModelIndex 项的方法对我来说没有任何意义 QModelIndex QAbstractItemModel index int row int colu
  • QObject 通用信号处理程序

    信号处理程序 是指插槽 而不是 POSIX 信号的处理程序 我需要 连接 可能不会 using QObject connect直接地 所有信号从 QObject 的 未知 子类的实例到一个单槽另一个 QObject 的 我需要这个才能通过网
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 当选项卡到另一个组件位置时,QML 中相应的滚动

    我想做的是 如果我从TextField到另一个组件 aComboBoxwtv 我希望滚动能够适应这一点 当我认为这非常重要时 当我执行连续选项卡时 我会转到滚动视图显示的内容下方的控件 一个例子是 假设我在这里 now i do 2 tab
  • QML 圆规

    我目前正在创建一个虚拟仪表板 我想获得针后面的进度条类型 如以下链接所示 https forum qt io topic 89307 qml circular gauge styling needle trailing colour glo
  • QTextEdit 与 QPlainTextEdit

    有什么区别QTextEdit and QPlainTextEdit 为什么要使用其中一种而不是另一种 我正在编写一个文本编辑器作为学习 Qt5 的练习 现在我想知道是否使用QTextEdit or QPlainTextEdit 到目前为止我
  • 通过信号/槽将 QVector 从工作线程传递到主线程

    目前 我在将 QVector 传递到线程之间时遇到一些麻烦 目前我有一个主线程 GUI Thread 和一个频繁发出 QVector 数组的工作线程 在向量内直接发出数据之前看起来不错 接收者是主线程中的一个槽 但该槽接收到的数据是乱码 这
  • 使用 CMake 时出现 Qt moc 错误

    我正在尝试编写一个 OpenCV 应用程序 使用 Qt 创建 GUI 并使用 CMake 生成 makefile 我遇到的问题是 当我尝试执行make命令 我收到错误 该文件是使用 5 2 1 中的 moc 生成的 它不能与此版本的 Qt
  • 仅使 QTreeWidgetItem 的一列可编辑

    我有一个QTreeWidgetItem有两列数据 有什么办法可以只让第二列可编辑吗 当我执行以下操作时 QTreeWidgetItem item new QTreeWidgetItem item gt setFlags item gt fl
  • QDateTime::fromstring( __DATE__, "MMM d yyyy") 返回无效

    解析MSVC 预定义 DATE 也许结合 TIME 宏与 QDateTime fromstring 不返回任何内容 无效的 QDateTime 对象 为什么 From http msdn microsoft com en us librar
  • Qt - 如何在保留选中状态的同时禁用 QCheckBox?

    我有一个带有两个复选框的对话框 我们称它们为 A 和 B 当未选中 A 时 B 应该能够根据用户的需要进行切换 当 A 被选中时 B 不应该能够被切换 现在 我的对话框构造函数中有以下内容 connect ui gt A SIGNAL to
  • 找不到 PySide SVG 图像格式?

    我正在使用 Eclipse 的 PyDev 插件与 Qt 集成 我安装了 PySide 但在使用 SVG 图像格式时遇到问题 我知道当我运行我的应用程序时 格式位于C Python27 Lib site packages PySide pl
  • 交叉引用标头中出现“未终止条件指令”错误

    有两个类在其标头中彼此相关 绘图标记 ifndef PLOTMARKER H define PLOTMARKER H include
  • 如何将 qmake 转换为 cmake?

    我有一个 pro我的项目上的文件 但现在我想将其移植到CMakeLists txt文件 我怎样才能做到这一点 QT core QT gui CONFIG c 11 TARGET test CONFIG console CONFIG app
  • QTextEdit:仅当滚动条位于底部时自动向下滚动

    有一个 QTextEdit 显示相当多的文本 它不可编辑 假设我想在开头阅读一些内容 向上滚动 但随后添加了一个新行 并且滚动条自动转到底部 我在使用各种程序时遇到类似的问题 无论它们是用什么语言编写的 如何处理这个问题 当向文本添加新行时

随机推荐

  • C++函数运用学习篇

    输入一个字符串 串内有数字和非数字字符 例如 abc456 sd78fd123s 789df 将其中连续的数字作为一个整数 依次存放到另一个整型数组b中 例如上述例子 将456放入b 0 中 78放入b 1 中 统计出整数的个数并输出这些整
  • JUC 九. CompletableFuture

    目录 一 CompletableFuture 计算结果完成时回调 一个线程的执行依赖另一个线程 二 根据案例再次了解 CompletableFuture supplyAsync 四 CompletableFuture 常用api简介 获取结
  • php opcode缓存的扩展xcache的使用

    安装的时候 跟安装其它扩展是一样的 wget http xcache lighttpd net pub Releases 3 1 0 xcache 3 1 0 tar gz tar xzf xcache 3 1 0 tar gz cd xc
  • 【综合类型第 36 篇】我的四周年创作纪念日

    这是 综合类型第 36 篇 如果觉得有用的话 欢迎关注专栏 今天早上习惯性的打开 CSDN 看下大家给我的点赞 收藏 评论和私信 其中有一条官方发送的消息 原来今天是我成为 IT 创作者四周年的纪念日 距离我在 2018 年 10 月 12
  • 背景图片填充整个div 不平铺

    第一步 div style width 400px height 400px div class aa div div 第二步 aa width 100 height 100 border 1px solid ccc background
  • 栈与队列理论知识【补】

    1 栈和队列有迭代器吗 为什么 迭代器的作用 C 中迭代器用于对数据结构中的元素进行顺序访问或随机访问 原因 因此 根据定义不允许顺序或随机访问的数据结构 迭代器就没有任何意义 栈 LIFO结构 任何时候只能访问栈顶元素 stack 源码
  • GAN学习之路(四):马尔可夫判别器(PatchGAN)

    概念 马尔可夫判别器是判别模型的一种 基于CNN的分类模型有很多种 很多网络都是在最后引入了一个全连接层 然后将判别的结果输出 输出结点 马尔可夫判别器则是不一样 直观来看 它完全由卷积层构成 最后输出的是一个n n的矩阵 最后取输出矩阵的
  • testNG中dataprovider使用的两种方式。

    testNG的参数化测试有两种方式 xml和dataprovider 个人更喜欢dataprovider 因为我喜欢把测试数据放在数据库里 一 返回类型是Iterator
  • 企业级springboot项目架构模板V5.0,开箱即用(针对中小型项目架构,免去重复造轮的操作,强烈推荐)

    下一个版本将整合sharding jdbc 且支持现有数据源的配置 请前往发行版下载 稳定版 https gitee com schema template quick template releases tag v5 0 master分支
  • LeetCode - 区间合并类问题

    合并区间 给出一个区间的集合 请合并所有重叠的区间 示例 1 输入 1 3 2 6 8 10 15 18 输出 1 6 8 10 15 18 解释 区间 1 3 和 2 6 重叠 将它们合并为 1 6 分析 C 排序 根据区间左边界排序 如
  • Effective C++ - Inheritance and Object-Oriented Design

    Effective C Inheritance and Object Oriented Design 前言 OOP面向对象编程 继承 单一继承 多重继承 public protected private virtual non virtua
  • Redis简明教程

    Redis是啥 用Redis官方的话来说就是 Redis is an open source BSD licensed in memory data structure store used as a database cache and
  • [ROS] roscore启动失败

    版本描述 Ubuntu18 04 ROS melodic 问题描述 ROS安装完成后 出现如下错误 具体原因是因为ROS1支持的是Python2 7 而我之前将Ubuntu自带的Python升级到了3 6 所以导致了相关的错误 nnboy
  • 伺服电机与编码器

    编码器的结构域工作原理 1 透射式旋转光电编码器 2 编码器的分辨率 3 编码器的分类和特点 按照工作原理 可以分为增量式和绝对式 4 伺服电机与编码器的工作 控制器驱动电机运转 电机带着编码器旋转 编码器的反馈信号输送到控制器 可以知道
  • 大数据毕设 深度学习 大数据 股票预测系统 - python lstm

    文章目录 0 前言 1 课题意义 1 1 股票预测主流方法 2 什么是LSTM 2 1 循环神经网络 2 1 LSTM诞生 2 如何用LSTM做股票预测 2 1 算法构建流程 2 2 部分代码 3 实现效果 3 1 数据 3 2 预测结果
  • ICLR2023《Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series》

    这是一篇ICLR2023 top 5 论文 论文链接 https openreview net pdf id vSVLM2j9eie 代码 https github com Thinklab SJTU Crossformer 1 Multi
  • dedecms--图片的轮播

    1 直接在php加代码 引入js css文件
  • shell脚本调用另一个脚本

    两种实现方式 shell脚本直接调用另一个脚本 shell脚本新建终端并执行另一个脚本 1 shell脚本直接调用另一个脚本 shellPath sh main shell script call other shell script ec
  • mysql 字符串分割函数substring_index用法

    实现和python split 函数一样的功能 mysql用函数substring index 用法 substring index str 分隔符 第n个分隔符之前的所有字符or倒数第n个分隔符之后的所有字符 例子 select subs
  • Qt4_深入信号和槽

    信号和槽 信号和槽是Qt 编程的一个重要部分 这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来 在前几个例程中 我们已经连接了信号和槽 声明了控件自己的信号和槽 并实现了槽函数 发送了信号 现在来更深入了解这个机制 槽和普通的