Qt 信号与槽

文章目录

  • [1. 信号和槽概述](#1. 信号和槽概述)
  • [2. 信号和槽的使用](#2. 信号和槽的使用)
    • [2.1 连接信号和槽](#2.1 连接信号和槽)
  • [3. 自定义槽](#3. 自定义槽)
  • [4. 自定义信号](#4. 自定义信号)
  • [5. 带参数的信号和槽](#5. 带参数的信号和槽)
  • [6. 信号与槽的连接方式](#6. 信号与槽的连接方式)
    • [6.1 一对一](#6.1 一对一)
    • [6.2 一对多](#6.2 一对多)
    • [6.3 多对一](#6.3 多对一)
  • [7. 信号与槽的断开](#7. 信号与槽的断开)
  • [8. 使用 Lambda 表达式定义槽函数](#8. 使用 Lambda 表达式定义槽函数)

1. 信号和槽概述

在 Qt 中,用户和控件的每次交互过程称为⼀个事件。比如 "用户点击按钮" 是⼀个事件,"用户关闭窗⼝" 也是⼀个事件。每个事件都会发出⼀个信号。例如:用户点击按钮会发出 "按钮被点击" 的信号,用户关闭窗⼝会发出 "窗⼝被关闭" 的信号。

Qt 中的所有控件都具有接收信号的能力,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。比如:输入框自己接收到 "输入框被点击" 的信号后,会做出 "显示闪烁的光标,等待用户输入数据" 的响应动作。在 Qt 中,对信号做出的响应动作就称之为槽

2. 信号和槽的使用

2.1 连接信号和槽


举个例子:
在窗口中设置⼀个按钮,当点击 "按钮" 时关闭 "窗口"


下面有一个问题:

这里传的是函数指针,但是参数是一个const char*,这两者一样吗?

肯定是不一样的,所以应该是不能相互赋值的。原因是:上面的函数声明,是以前旧版本的函数声明。

3. 自定义槽

自定义槽和自己定义一个成员函数没有什么区别。
代码方式:

下面我们需要按下按钮,就可以改变标题:

结果如下:

图形化方式:




当函数名符合上述规则之后,Qt就能自动的把信号和槽给建立上链接

4. 自定义信号


举个例子:


在 widget.h 中声明自定义的信号和槽,如图:

下面我们需要将信号和槽关联起来:

这里有个问题,如果现在启动程序什么都没有,原因是:我们只是关联信号和槽,但是没有发出信号。

那么自定义信号呢?

需要用一个emit关键字:

当我们发送信号MySignal()函数时,这个函数里会自动的生成相关定义。

5. 带参数的信号和槽


示例1:重载信号槽
在 "widget.h" 头文件中声明重载的信号函数以及重载的槽函数;如下图所示:

C++中声明函数的时候,形参的名字可以不必写。

在 "Widget.cpp" 文件实现重载槽函数以及连接信号和槽:
注意:在定义函数指针时要指明函数指针的作用域。


执行结果如下图所示:

其实信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数。

2、在 "widget.cpp" 文件中实现槽函数以及连接信号和槽。


6. 信号与槽的连接方式

6.1 一对一

主要有两种形式,分别是:一个信号连接一个槽 和 一个信号连接一个信号

一个信号连接一个槽:

举个例子:
在 "widget.h" 中声明信号和槽以及信号发射:

在 "widget.cpp" 中实现槽函数,信号发射函数以及连接信号和槽:

一个信号连接一个信号:

在上述示例的基础上,在 "widget.cpp" 文件中添加如下代码:

6.2 一对多

一个信号连接多个槽

在 "widget.h" 头文件中声明⼀个信号和三个槽:

在 "widget.cpp" 文件中实现:

6.3 多对一


在 "widget.h" 头文件中声明两个信号以及一个槽:

在 "widget.cpp" 文件中实现槽函数以及连接信号和槽:

7. 信号与槽的断开

使⽤ disconnect 即可完成断开,disconnect 的⽤法和 connect 基本⼀致。

8. 使用 Lambda 表达式定义槽函数

Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 ⽤于定义并创建匿名的函数对象,以简化编程⼯作。

Opt 部分是可选项,最常用的是 mutable声明 ,这部分可以省略。

Lambda表达式外部的局部变量通过值传递进来时,其默认是 const,所以不能修改这个局部变量的拷贝,加上mutable 就可以修改。

相关推荐
名誉寒冰2 小时前
# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
qt·学习·rpc
xiaoyaoyou.xyz3 小时前
嵌入式Linux Qt开发:1、搭建基于ubuntu18.04的Qt开发环境及测试(解决Qt creator输入法问题)
linux·qt
小龙Guo6 小时前
QT+opencv实现卡尺工具找圆、拟合圆
开发语言·qt·opencv
破晓的历程8 小时前
Qt之Qfile类
开发语言·qt
feiyangqingyun11 小时前
Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载
c++·qt·gb28181·录像回放·录像文件下载
忆源14 小时前
【Qt】之音视频编程2:QtAV的使用篇
开发语言·qt·音视频
enyp8014 小时前
Qt原型模式实现与应用
开发语言·qt·原型模式
忆源19 小时前
【Qt】之音视频编程1:QtAV的背景和安装篇
开发语言·qt·音视频
teacher伟大光荣且正确1 天前
Qt Creator 配置 Android 编译环境
android·开发语言·qt
六bring个六1 天前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl