先记住两个单词:signal(信号)、slot(槽)
仓库位置:https://github.com/Github-Programer/Qt-Notes/tree/master/Qt/03_Signalc/signalc
上次在界面内用代码做出了一个按钮,并可以设置其大小、位置,也可以设置窗口的位置、大小,但是这样玩玩就没意思了,这按钮按来按去没反应,像这些按钮都是可以有用处的,不过Qt自动给你设置了按钮按下的样子
我们需要做的不是静态界面,而是可以有互动的界面,于是信号与槽隆重登场!
#1首先:信号和槽是什么?
举例
- 还记得阿拉丁神灯吗?要让灯神出现需要什么步骤?
阿拉丁神灯->摩擦->神灯->灯神出现
- 假设我需要一个按钮,要让窗口关闭那么顺序是,
按钮->点击->窗口->关闭
- 信号槽亦是如此,分析一下,阿拉丁神灯 就是信号的发送者,点击 是动作也可以成为信号的具体信息,神灯 就是信号的接受者,灯神出现 就是处理信号也叫槽(槽函数)
- 信号槽就是触发(信号的发送者)什么之后执行(处理信号)函数(槽)
#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();
照样可以关闭窗口!