【Qt】7.信号和槽_connect函数用法(1)

文章目录

  • [1. 信号](#1. 信号)
  • [2. 槽的本质](#2. 槽的本质)
  • [3. 信号和槽的使用](#3. 信号和槽的使用)
    • [3.1 连接信号和槽](#3.1 连接信号和槽)

1. 信号

Linux 信号Signal:系统内部的通知机制,进程间通信的方式

  • 信号源:谁发的信号。
  • 信号的类型:哪种类别的信号。
  • 信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行。
    Qt中的信号和Linux中的信号,虽然不是一样的概念,但是确实有相似之处

Qt中,谈到信号,也是涉及到三个要素。

  1. 信号源:由哪个控件发出的信号。

  2. 信号的类型:用户进行不同的操作,就可能触发不同的信号。

    • 点击按钮,触发点击信号。

    • 在输入框中移动光标,触发移动光标的信号。

    • 勾选一个复选框

    • 选择一个下拉框都会触发出不同的信号。

  3. 信号的处理方式:槽(slot)=>函数

Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来,后续只要信号触发了,Qt就会自动的执行槽函数。
一定是先把信号的处理方式准备好,再触发信号。

Qt中,一定是先关联号信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了(错过了)

  1. 信号的本质:

信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时 Qt 对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。

  1. Qt 中信号是通过什么形式呈现给使用者的呢?

    • 我们对哪个窗口进行操作, 哪个窗口就可以捕捉到这些被触发的事件。

    • 对于使用者来说触发了一个事件我们就可以得到 Qt 框架给我们发出的某个特定信号。

    • 信号的呈现形式就是函数, 也就是说某个事件产生了, Qt 框架就会调用某个对应的信号函数, 通知使用者。

  2. Qt 中信号的发出者是某个实例化的类对象。


2. 槽的本质

槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++ 函数是一样的,可以定义在类的任何位置( publicprotectedprivate ),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。

槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

  1. 信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。例如: "按钮被按下" 这个信号可以用 clicked() 函数表示,"窗口关闭" 这个槽可以用 close() 函数表示,假如使用信号和槽机制

    实现:"点击按钮会关闭窗口" 的功能,其实就是 clicked() 函数调用 close() 函数的效果。

  2. 信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:

  • 信号函数用 signals 关键字修饰,槽函数用 public slots、protected slots 或者 private slots 修饰。signals 和 slotsQtC++ 的基础上扩展的关键字,专门用来指明信号函数和槽函数;
  • 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。
    Qt中提供的这些类,本身是存在一定的继承关系的。QObject就是其他Qt内置类的"祖宗"。

信号函数的定义是 Qt 自动在编译程序之前生成的。编写 Qt 应用程序的程序猿无需关注。

这种自动生成代码的机制称为 元编程 (Meta Programming) 。这种操作在很多场景中都能见到。


3. 信号和槽的使用

3.1 连接信号和槽

connect的具体用法:

cpp 复制代码
bool connect(const QObject *sender, 
             const char *signal_, 
             const QObject *receiver, 
             const char *method, 
             Qt::ConnectionType type = Qt::AutoConnection);

参数说明:

  • sender:信号的发送者;
  • signal:发送的信号(信号函数);
  • receiver:信号的接收者;
  • method:接收信号的槽函数;
  • type: 用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定。

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

图标带锯齿的是槽函数,如click

图标类似于wifi信号的是信号函数,如clicked

widget.cpp

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton* button = new QPushButton(this);
    button->setText("关闭");
    button->move(200,200);
    //click是一个slot函数,作用就是在调用的时候相当于点击了一下按钮
    //clicked(过去分词形式,完事了,点完了),才是要触发的点击信号
    //connect要求,前俩参数是匹配的.button的类型如果是QPushButton*
    //此时,第二个参数的信号必须是QPushButton内置的信号(父类的信号),不能是一个其他的类,比如QLineEdit的信号~~
    //close是QWidget内置的槽函数.Widget继承自QWidget,也就继承了父亲的槽函数
    //close槽函数功能已经是人家内部实现好了,不需要咱们去关心。具体的作用就是关闭当前的窗口/控件。
    connect(button,&QPushButton::clicked,this,&Widget::close);
}

Widget::~Widget()
{
    delete ui;
}

运行:

点击后关闭

相关推荐
码界奇点3 小时前
平替MongoDB金仓多模数据库在电子证照国产化中的实践与优势
数据库·mongodb·社交电子·里氏替代原则
optimistic_chen3 小时前
【Java EE进阶 --- SpringBoot】Mybatis操作数据库(基础二)
xml·数据库·spring boot·笔记·java-ee·mybatis
jingfeng5143 小时前
MySQL表的增删改查
数据库·mysql
小龙报4 小时前
《算法通关指南---C++编程篇(1)》
开发语言·c++·程序人生·算法·学习方法·visual studio
YongCheng_Liang4 小时前
Oracle数据库基本命令的8个模块
运维·数据库·oracle
Cx330❀4 小时前
《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)
开发语言·数据结构·c++·经验分享·算法·list
CC.GG4 小时前
【C++】STL容器--list的使用
开发语言·c++·list
洲覆4 小时前
基于 clangd 搭建 Redis 6.2 源码阅读与调试环境
开发语言·数据库·redis·缓存
凯子坚持 c4 小时前
Redis 事务深度解析:从基础到实践
数据库·redis·缓存