【QT】——05_信号和槽(笔记)


说明
如果窗口内按钮有很多,不可能全部写在主函数中,会让主函数过于长,这些功能全部在窗口的构造函数内实现,这里就需要用到信号和槽。

创建按钮

1.在头文件中定义两个按钮
一个普通的,一个指针的

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

private:
    QPushButton b1;
    QPushButton *b2;
};
#endif // MAINWIDGET_H

2.在cpp中实现
注意指针的要new

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setText("开始");
    b1.setParent(this);
    b1.move(100,100);

    b2 = new QPushButton(this);
    b2->setText("结束");
    b2->move(200,100);
}

MainWidget::~MainWidget()
{
}

书写信号

选中QPushButton进入到帮助文档
在这里插入图片描述
进入到基类,在Contets中有个Signals(信号),点进去里面有按钮的一些信号的函数
在这里插入图片描述
这里我选择按下

书写方式:

    /*
     * b2:信号发出者,指针类型;
     * &QPushButton::pressed:处理信号,&发送者的类名::信号名字;
     * this:信号接受者,谁感兴趣谁接收;
     * &MainWidget::close:槽函数,信号处理函数,&接收的类名::槽函数名字
     */
     //关闭窗口
connect(b2,&QPushButton::pressed,this,&MainWidget::close);

自定义槽

说明
普通函数的用法;
Qt5:任意的成员函数,普通全局函数,静态函数;
槽函数需要和信号一致(参数,返回值);
由于信号都是没有返回值的,所以槽函数一定没有返回值;

想实现的效果:
点击按钮,使其改变本身的按钮的名字;

1)头文件中定义自己的函数

	//自定义槽
    void mySlot();

2)cpp中实现

void MainWidget::mySlot()
{
    b1.setText("123");
}

3)构造函数书写

    // 抬起b1按钮的时候改变b1按钮的Text内容
    connect(&b1,&QPushButton::released,this,&MainWidget::mySlot);

同样的信号不同的槽

信号和槽的关系:
信号——短信;
槽——接收短信的手机;

    //抬起b1按钮,将b2隐藏
    connect(&b1,&QPushButton::released,b2,&QPushButton::hide);

两个窗口相互切换

窗口切换时会收缩窗口的大小,可以用resize(宽,高)固定大小。

1.创建一个新窗口类
在这里插入图片描述
2.Base class选择QWidget
3.在新建的类头文件中定义一个按钮用于切换回主界面
4.在cpp中设置窗口标题以及按钮的属性
5.在主窗口类中包含副窗口的头文件
6.在头文件中定义副窗口的对象
7.
副窗口.h

#ifndef SETWIDGET_H
#define SETWIDGET_H

#include <QWidget>
#include <QPushButton>
class SetWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SetWidget(QWidget *parent = nullptr);

    void sendSlot();
signals:
    /*信号必须有这个关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal();
     */
    void mySignal();
private:
    QPushButton b4;
};

#endif // SETWIDGET_H

副窗口.cpp

#include "setwidget.h"

SetWidget::SetWidget(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("设置栏");

    //设置窗口大小
    resize(400,400);

    b4.setText("返回");
    b4.setParent(this);
    b4.move(100,100);

    connect(&b4,&QPushButton::clicked,this,&SetWidget::sendSlot);
}

void SetWidget::sendSlot()
{
    emit mySignal();
}

头文件中要有signals:关键字,在关键字中定义一个信号用于发射给主窗口(不用实现)。再定义一个函数用于将此信号发射出去,要发射的信号名前面加上emit。

8.主窗口定义一个槽函数,用来接收副窗口发射过来的信号并在函数中实现想要的效果。
9.主窗口类中开始连通

main中:

//显示子窗口
    connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);

    //处理子窗口信号
    connect(&S,&SetWidget::mySignal,this,&MainWidget::dealSet);

成员函数的实现:

void MainWidget::changeWin()
{
    //子窗口显示
     S.show();
     //本窗口隐藏;
     this->hide();
}

void MainWidget::dealSet()
{
    //子窗口显示
     S.hide();
     //本窗口隐藏;
     show();
}

总结
其他子窗口的connect的作用就是将各自窗口创建的信号(Signals)发射出去,由主窗口接收到以后书写各自的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非西昂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值