QT-信号与槽机制

在这里插入图片描述

connect(发起者,信号,接收者,槽函数)

发起者发出信号,接收者执行槽函数

  • 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、Lambda表达式等无需接收者的时候除外);

  • 信号和槽函数返回值是 void

  • 信号只需要声明,不需要实现

  • 槽函数需要声明也需要实现

  • 槽函数是普通的成员函数,作为成员函数,会受到 public、private、
    protected 的影响;

  • 使用 emit 在恰当的位置发送信号;

  • 任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函

  • 信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。

  • 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,
    即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起
    来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数
    的参数比信号的少)。

  • 查看控件信号,当前没有Signal,必须看父类
    在这里插入图片描述

去父类中查找,因为是从父类中继承下来的在这里插入图片描述

  • 在堆上,在当前this窗口创建按钮控件
QPushButton *btn1=new QPushButton("关闭",this);

自定义信号和槽

窗口切换【设计思路】
在这里插入图片描述

显示窗口要先创建其控件(new)
查询窗口找不到主窗口,主窗口在其构造函数里
所以emit back()信号

  • 创建swidget类
  • 在widget创建swidget窗口控件
  • widget使用信号槽,this隐藏,s显示
  • 在swigdet中emit back信号,widge中使用信号槽接受信号,并this显示,s隐藏。而不能在swidget中将widget隐藏,因为找不到widget中的this,即地址
  • Swidget*s=new Swidget();不能加this,因为不属于本窗口

swidget.h【emit back()信号】

#ifndef SWIDGET_H
#define SWIDGET_H

#include <QWidget>

class Swidget : public QWidget
{
    Q_OBJECT
public:
    explicit Swidget(QWidget *parent = 0);

signals:
    void back();
public slots:

};

#endif // SWIDGET_H

swidget.cpp

#include "swidget.h"
#include<QPushButton>
Swidget::Swidget(QWidget *parent) :
    QWidget(parent)
{
    QPushButton*btn=new QPushButton("back",this);

    connect(btn,&QPushButton::clicked,[=](){
        emit this->back();
    });

}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include"swidget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    Swidget*s=new Swidget();

    QPushButton*btn= new QPushButton("下一个窗口",this);

    connect(btn,&QPushButton::clicked,[=](){
        this->hide();
        s->show();
    });
    connect(s,&Swidget::back,[=](){
        this->show();
        s->hide();
    });
}

Widget::~Widget()
{
    delete ui;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值