QT学习(三)——信号和槽1 - 概念、简单应用

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()
{
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值