- 信号与槽的概念
信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下(button),它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
2.系统自带的信号与槽
connect()函数最常用的一般形式:
connect(sender, signal, receiver, slot);
参数解释:
sender:发出信号的对象signal:发送对象发出的信号receiver:接收信号的对象。
signal:发送对象发出的信号。
receiver:接收信号的对象。
slot:接收对象在接收到信号之后所需要调用的函数(槽函数)
1#include "widget.h"
2#include <QPushButton>
3Widget::Widget(QWidget *parent)
4: QWidget(parent)
5 {
6//创建一个按钮 点击按钮关闭窗口
7//this‐>close();
8QPushButton *p = new QPushButton("关闭",this);
9//设置连接 点击按钮产生信号 会调用窗口的close函数
10connect(p,&QPushButton::clicked,this, &QWidget::close);
11 }
12
13 Widget::~Widget()
14 {
15
16 }
3按钮常用的信号
4.自定义的槽函数
1#ifndef WIDGET_H
2#define WIDGET_H
3
4#include <QWidget>
5#include <QPushButton>
6class Widget : public QWidget
7 {
8 Q_OBJECT
9
10public:
11Widget(QWidget *parent = 0);
12~Widget();
13QPushButton *button;
14public slots:
15void print();//槽函数
16
17 };
18
19 #endif // WIDGET_H
1#include "widget.h"
2#include <QDebug>
3Widget::Widget(QWidget *parent)
4: QWidget(parent)
5 {
6button = new QPushButton;
7button‐>setParent(this);
8button‐>setText("打印gt牛逼");
9//注册信号与槽的连接
10//槽函数可以是普通的成员函数 还可以是槽函数
11//如果信号没有参数 槽函数也不能有参数 如果信号有参数,槽函数可以有也可以没有
12connect(button,&QPushButton::pressed,this,&Widget::print);
13
14 }
15
16 void Widget::print()
17 {
18
19 qDebug()<<”gt最牛逼";
20 }
21 Widget::~Widget()
22 {
23
24 }
5.自定义信号(本身也是一个函数)
5.1:子函数
5.1.1:首先要创造出一个父类是qwidget的子窗口,因为在子窗口中无法控制父窗口,所以在子窗口内定义并且发射了信号1。
5.1.2:子窗口内需要定义一个按钮,并且设置名字再加以显示出来。
5.1.3:然后子窗口内进行信号(按钮的按下)与槽函数(emit_shingle)的连接,及按下按钮2--->执行发送槽函数->发送show_single信号给父窗口。
5.2:父函数
5.2.1:首先父函数内要定义可以指向子函数的指针(sonwindow),还有他本身的按钮(1),以及按钮槽函数和信号槽函数。
5.2.2:设置父窗口的名字,以及显示子窗口,因为子窗口就在父窗口里面创建的,父窗口是可以控制子窗口滴。设置父窗口按钮的名字并且显示出来。
5.2.3:进行点击信号与按钮1的连接->执行按钮槽函数;进行子窗口与show_single信号的连接-->执行信号槽函数,就是在子窗口的按钮按下时,发送了show_single信号然后父窗口接收到了该信号执行了信号槽函数。
补充:若信号函数是有参数的,那么接收到这个信号的槽函数是可以收到这个参数的。
6.现象展示:
互相点击会消失一个窗口,点击子窗口会打印数字10。