qt 信号与槽的用法和定义

2023-10-26

转自:http://blog.csdn.net/kaffeel/article/details/5568954

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

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

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

在目前有的例子中,我们已经连接了不同的信号和槽。实际使用中还要考虑如下一些规则:
1、一个信号可以连接到多个槽:
connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(updateStatusBarIndicator(int)));
当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。

2、多个信号可以连接到同一个槽
connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()),this, SLOT(handleMathError()));
任何一个信号发出,槽函数都会执行。

3、一个信号可以和另一个信号相连
connect(lineEdit, SIGNAL(textChanged(const QString &)),
              this, SIGNAL(updateRecord(const QString &)));
 第一个信号发出后,第二个信号也同时发送。除此之外,信号与信号的连接和信号与槽连接相同。
 
4、连接可以被删除
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时才发出salaryChanged()信号,这样避免了死循环的出现。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
Qt的元对象(Meta-Object)系统
Qt的一个最主要的成功是对C++扩展,即把彼此独立的软件模块连接起来,而模块间彼此不需要知道相连模块的任何细节。
这个机制就是Meta-Object系统,它提供了两个关键的用途:信号和槽和introspection(内省)。introspection功能允许程序员在程序运行时得到QObject它子类的“元信息(meta-information)”,这对实现信号和槽是很必要的,包括全部信号和槽的列表,和类的名字。这个机制还提供了属性(在Qt Designer中使用)和文本翻译(国际化)支持。它们构成了QSA(Qt Script for Application)的基础。

标准C++不提供Qt meta-object系统所需的动态meta-information。为解决该问题,Qt提供了一个独立的工具moc,它通过C++函数来解析Q_OBJECT宏类定义而获得信息。moc是用纯c++实现的,因此元对象系统可以使用在任何C++编译器中。

这个机制工作过程如下:
Q_OBJECT宏声明了一些QObject子类中必须实现的内省函数:metaObject(),TR(),qt_metacall()等。
Qt的moc工具会实现Q_OBJECT宏声明的函数和所有的信号。
QObject成员函数例如connect()和disconnect()使用这些内省函数实现信号和槽的连接。
以上这些是通过qmake,moc和QObject自动处理的,程序员通常不用考虑它们。如果你感到对此好奇,可以查看QMetaObject类文档和moc生成的c++源文件。

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

qt 信号与槽的用法和定义 的相关文章

随机推荐

  • 20191004在LINUX下如何将tar压缩文件解压到指定的目录下

    百度搜索 tar 解压缩到指定目录 https zhidao baidu com question 9844116 html 在LINUX下如何将tar压缩文件解压到指定的目录下 各位 请教一下在LINUX下如何将tar压缩文件解压到指定的
  • 硬盘安装Freebsd7.0无痛快速版

    硬盘安装Freebsd成功了 安装Freebsd 7 0 最小系统在 我的老笔记本上 toshiba portege 3490ct 用时10分钟 1 去 sourceforge net 下载一个 unetbootinhttp downloa
  • API 和ABI的区别

    应用程序二进制接口 ABI Application Binary Interface 定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则 主要包括基本数据类型 通用寄存器的使用 参数的传递规则 以及堆栈的使用等等 ABI涵
  • 前端CSS权重你了解吗?

    CSS权重 CSS权重指的是样式的优先级 有两条或多条样式作用于一个元素 权重高的那条样式对元素起作用 权重相同的 后写的样式会覆盖前面写的样式 权重的等级 可以把样式的应用方式分为几个等级 按照等级来计算权重 1 important 加在
  • 研究生毕业致谢感言

    时光荏苒 转眼便已进入硕士研究生的尾声 如果以相机倒带的形式回顾过去两年半的时间里 有为了研修学分而奔波于教室和图书馆之间的镜头 有为了做实验写论文埋头苦干到深夜的镜头 有受过打击受过伤害 相然也有喜悦振臂高呼的镜头 硕士研究生的结果很美好
  • python设置画图风格_Python可视化33

    本文详细介绍matplotlib 绘图风格 style 及rcParams设置 本文速览 1 rcParams默认参数修改 rcParams中默认参数绘图 修改rcParams默认参数 取消rcParams参数修改 2 绘图风格设置 wit
  • Python入门之Lambda函数

    匿名函数的定义 在 Python 里有两类函数 第一类 用 def 关键词定义的正规函数 第二类 用 lambda 关键词定义的匿名函数 Python 使用 lambda 关键词来创建匿名函数 而非def关键词 它没有函数名 其语法结构如下
  • Java 读取任意shapefile的所有字段,并插入到MongoDB数据库(Spring Boot)

    文章目录 Java 读取任意shapefile的所有字段 并插入到MongoDB数据库 Spring Boot 1 统一返回结果封装 2 shp文件数据实体封装 3 核心代码 3 可能出现的异常 3 1 异常产生原因 3 2 解决方案 4
  • idea debug高级特性看这篇就够了

    文章目录 多线程调试 循环遍历条件断点 显示方法返回值 调试过程中动态修改变量的值 调试内存泄露 所谓工欲善其事必先利其器 从eclipse转idea也有一段时间了 一直想总结下idea调试的一些高级技巧 debug过程如果高效 撸代码也会
  • Matlab实现图像的比例缩放

    以灰度图像circuit tif为例 利用Matlab图像处理工具箱中的imresize函数对图像进行比例缩放变换 要求 创建4个figure窗口 不可以用subplot 显示不出来放大效果 分别用于显示原始图像 等比例放大1 5倍后的图像
  • 记录--vue+three,制作iview大波浪特效

    这里给大家分享我在网上总结出来的一些知识 希望对大家有所帮助 一 效果图 具体效果可参考iview官方界面iView 一套高质量的UI组件库 大波浪效果 使用的是three js的官方例子 需要先安装three js支持 npm insta
  • mysql用到了 all 和 Using temporary; Using filesort,如何优化?

    使用 EXPLAIN 分析查询的执行计划可以帮助优化查询 这两个标识表示 MySQL 需要使用临时表来执行查询 或者在查询结束时对结果进行排序 这可能会导致查询运行得更慢 要优化查询 你可以尝试以下方法 尽量避免使用 SELECT 而是只选
  • DDD(领域驱动设计)系列主题:聚合和聚合根

    本篇文章主要介绍了聚合根 聚合的概念 然后介绍了聚合的设计过程和原则 以及对比了聚合 聚合根 实体 值对象的特点 思考的问题 为什么要在限界上下文和实体之间增加聚合和聚合根的概念 它们的作用是什么 如何设计聚合 概念和职责 聚合根 如果把聚
  • 2020年数学建模国赛A题:炉温曲线

    2020年高教社杯全国大学生数学建模竞赛题目 请先阅读 全国大学生数学建模竞赛论文格式规范 A题 炉温曲线 在集成电路板等电子产品生产中 需要将安装有各种电子元件的印刷电路板放置在回焊炉中 通过加热 将电子元件自动焊接到电路板上 在这个生产
  • 虚拟机的快捷键

    ctrl alt 鼠标就出来了 ctrl c 中断当前操作
  • 谷粒商城--从入门到入坟(持续更新)第一篇:总体概括

    简介 谷粒商城项目 是尚硅谷的一套基于微服务的电商视频 在网上大受欢迎 本人系大三老狗 准备用大约一个月时间 去拆解该商品的知识点 由点及面 最后希望呈现一个比较好的效果 每个知识点 配套的安装软件及源码也会发布出来 希望有伙伴能一起进步
  • 自定义控件.DateTimePicker_02

    ZC 踩坑过程在 后面 1 在 Generic xaml 中添加内容
  • Unknown system variable 'query_cache_size' 问题终于解决了,原来是这样!

    遇到这种问题搞了半天终于解决 原因 mysql connecter java的版本过低 很显然是数据库驱动程序与数据库版本不对应 查看了一下配置 发现mysql connector java的版本是5 1 37 而我本地mysql版本是8
  • Mysql中explain执行计划信息中字段详解

    Mysql中explain执行计划信息中字段详解 1 获取执行计划 2 字段含义 2 1 id 2 2 select type 2 3 table 2 4 partitions 2 5 type 2 6 possible keys 2 7
  • qt 信号与槽的用法和定义

    转自 http blog csdn net kaffeel article details 5568954 信号和槽是Qt编程的一个重要部分 这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来 在前几个例子中 我们已经连接了信号