3.1 前置工作
先新建一个项目day02,这里设置的一个类为 Mywidget,其是 QWidget 的子类
如下所示:
3.2 信号和槽的基本概念
-
信号和槽
:是QT框架引以为豪的东西。实际上就是
观察者模式
的一种简易方式。 -
使用
connect 函数
可以为信号以及槽建立好连接,当信号广播时(触发),槽做出相应的处理。 -
信号来源于被观察者,槽来自于观察者。
-
Signal信号:
函数声明,无需实现
。系统大多数类,都内置了信号 开发者也可以自定义信号。 -
Slot槽:本质就是一个函数
一般是类的成员函数 有声明且有实现体
。系统大多数类,都内置了槽 开发者也可以自定义槽。
信号和槽的几种连接方式
(1)用法一
connec(被观察者, 信号函数, 观察者, 槽函数);
(2)用法二
connect(被观察者, 信号函数, Lampda表达式匿名函数);
(3)用法三:针对老版本4.0以前
connect(被观察者, SIGNAL(信号函数), 观察者, SLOT(槽函数));
3.3 案例1(最大化按钮)
设计一个最大化按钮,当按钮被按下后,窗口变成最大化。
- 观察者:窗口
- 被观察者:最大化按钮
- 信号:点击
-
槽:变最大化
connect函数原型语法
语法:
connect (被观察者,信号,观察者,槽);
(1)创建一个按钮
(2)建立信号和槽的连接
(3)运行结果
点击 ” 最大化 “ 按钮后窗口变为最大化了:
(4)添加最小化、正常化按钮
(5)运行结果
3.4 案例2(打老鼠按钮)
设置一个按钮:
按住该按钮屏幕打印 ”老鼠被打了“;
松开该按钮屏幕打印 ”老鼠反抗了“
(1)前置知识:一些C++11 新特性
(2)Lambda表达式
-
形式1:
[变量名1,变量名2,.....] (参数表) -> 返回值 { 函数体 }
指定部分变量访问
这种是以值传递的方式传入的,不能在内部进行改变值。
-
形式2:
[=] (参数表) -> 返回值 { 函数体 }
(值传递形式)
捕获所有外部变量
(内部无法改变实际变量)
同样也是值传递,不能改变值
-
形式3:
[&] (参数表) -> 返回值 { 函数体 }
(引用形式)捕获所有外部变量(内部可以改变实际变量)
(3)利用Lambda表达式实现槽函数
运行结果:
(4)示例代码:
Mywidget.cpp
#include "Mywidget.h"
#include <QPushButton>
#include <QDebug>
Mywidget::Mywidget(QWidget *parent)
: QWidget(parent)
{
//---------------- 案例1 -------------------//
// 最大化按钮 (被观察者)
QPushButton* btnMax = new QPushButton("最大化", this);
// this窗口 (观察者)
// 建立信号 和 槽连接 clicked()信号:表示按钮被点击了 showMaximized()槽函数:表示窗口最大化
connect(btnMax, &QPushButton::clicked, this, &Mywidget::showMaximized);
QPushButton* btnMin = new QPushButton("最小化", this);
btnMax->move(100, 0);
// showMinimized()槽函数:表示窗口最小化
connect(btnMin, &QPushButton::clicked, this, &Mywidget::showMinimized);
QPushButton* btnNormal = new QPushButton("正常", this);
btnNormal->move(200, 0);
// showNormal()槽函数:表示窗口正常化
connect(btnNormal, &QPushButton::clicked, this, &Mywidget::showNormal);
// ---------------- 案例2 ------------------//
// 设置一个按钮
// 鼠标按下 打印 被打了
// 鼠标抬起 打印 反抗
QPushButton* btn = new QPushButton("老鼠", this);
btn->move(200, 200);
// 当按钮被点击时,调用lambda表达式函数
connect(btn, &QPushButton::pressed, []()->void{
qDebug() << "老鼠被打了";
});
connect(btn, &QPushButton::released, []()->void{
qDebug() << "老鼠反抗了";
});
}
Mywidget::~Mywidget()
{
}