详解Qt中信号与槽,附加实例

先记住两个单词:signal(信号)、slot(槽)
仓库位置:https://github.com/Github-Programer/Qt-Notes/tree/master/Qt/03_Signalc/signalc


上次在界面内用代码做出了一个按钮,并可以设置其大小、位置,也可以设置窗口的位置、大小,但是这样玩玩就没意思了,这按钮按来按去没反应,像这些按钮都是可以有用处的,不过Qt自动给你设置了按钮按下的样子
在这里插入图片描述
我们需要做的不是静态界面,而是可以有互动的界面,于是信号与槽隆重登场!

#1首先:信号和槽是什么?

信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

举例

  • 还记得阿拉丁神灯吗?要让灯神出现需要什么步骤?阿拉丁神灯->摩擦->神灯->灯神出现
  • 假设我需要一个按钮,要让窗口关闭那么顺序是,按钮->点击->窗口->关闭
  • 信号槽亦是如此,分析一下,阿拉丁神灯 就是信号的发送者点击动作也可以成为信号的具体信息神灯 就是信号的接受者灯神出现 就是处理信号也叫槽(槽函数)
  • 信号槽就是触发(信号的发送者)什么之后执行(处理信号)函数(槽)

在这里插入图片描述

#2信号槽有什么优点?

  • 松散耦合,信号 发送端 和 接收端 本身是没有关联的
  • 通过connect函数连接,使得两段连接在一起
  • 槽也不需要和信号绑定在一起
  • 我怎么觉得Python和这个很像呀?

#3实例:点击按钮关闭窗口
首先设计一个按钮和设置窗口:

  • 名称:btn
  • 大小:100x100
  • 窗口大小:600x400

其次使用connect函数连接(等会详细解释)

connect(btn, &QPushButton::clicked, this, &QWidget::close);

在这里插入图片描述
完整代码:(哦对了,文件名叫做myWidget.cpp)

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QPushButton>
#include <qDebug>

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
    resize(600, 400);
    QPushButton * btn = new QPushButton("关闭窗口", this);
    btn->resize(100, 100);
    btn->move(100, 100);
    connect(btn, &QPushButton::clicked, this, &QWidget::close);
}

myWidget::~myWidget() //这应该是析构函数
{
    qDebug() << "我的按钮类析构" << endl;
    delete ui; //删除类时删除ui
}

文件树:
在这里插入图片描述
#4现在来分析一下connect函数的功能

还是以刚才的这一句

connect(btn, &QPushButton::clicked, this, &QWidget::close);

1、btn 是我们创建的按钮实例(对象),就是信号的发送者
2、&QPushButton::clicked是信号,代表按钮被按下
你在输入这一句的时候,提示框显示的clicked前的图标是前面带波浪的遥控器(形容不了)
在这里插入图片描述
有这种图标的就是信号的意思,好了,打开Assistant Qt助手(自带),找找QPushButton类
在这里插入图片描述
这里并没有signals,就是QPushButton没有信号,那么它是继承QAbstractButton,于是去这里看
在这里插入图片描述
找到信号了,咱们要的是点击功能,选择clicked函数,其中参数就是一个布尔值。点击绿色部分可以查看详细介绍
在这里插入图片描述
这个clicked函数就是一个信号


3、接受者this,这个就是给自己呗
4、&QWidget::close 槽函数
打开Assistant接着查:
myWidget是咱们自己建立的类,查不着,那么myWidget的父类是QWidget类,找QWidget!
在这里插入图片描述
这个Signals现在没什么用,看Public Slot,这里面有很多功能函数(自带槽)

我们想让窗口关闭应该选择close()函数
在这里插入图片描述
你点进去还有函数的详细介绍
在这里插入图片描述
第一句说了,Closes this widget,就是关闭窗口。

#5扩展?
你可以将槽函数拓展一下,不只是关闭窗口,可以点击按钮输出一句话?弹出一个窗口?或者更加新奇!


#6使用UI拖拽?

学会槽函数,你可以渐渐使用UI操作了,点击.ui文件,进入设计

你可以拖拽一个按钮,改一个名字,右键选择转到槽
在这里插入图片描述
接着会让你选择信号,就选clicked
在这里插入图片描述
会进入myWidget.cpp(你们的名字我不知道)新建一个函数

你就写上QWidget::close();照样可以关闭窗口!
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章