Qt学习第二课:信号量与槽

Qt信号与槽

       信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

1. 系统自带的信号和槽

首先,我们在空窗体中写一个按钮,实现点击这个按钮,窗体就关闭的功能。

#include "mywidget.h"
#include
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
   /* 另一种创建按钮的格式
    QPushButton* btn = new QPushButton;
    btn->setParent(this);
    btn->setText("王者荣耀");
    btn->move(100,100);*/
    QPushButton* btn2 = new QPushButton("关闭窗口",this);
    this->resize(600,400);

    this->setWindowTitle("第一个项目");
    this->setFixedSize(600,400);
    connect(btn2, &QPushButton::clicked, this, &MyWidget::close);//把btn2的点击事件和窗体自带的close函数连接起来
}

MyWidget::~MyWidget()
{

}

连接信号和槽的函数:

       connect(sender, signal, receiver, slot);

       sender:发送信号的对象

       signal:对象发出的信号

       receiver:接受对象的信号

       slot:接受对象接受到信号需要调用的函数(槽)

那么Qt自带的信号和槽很多,该如何去寻找呢?

      这个就需要利用帮助文档了,在帮助文档中比如我们上面的按钮的点击信号,在帮助文档中输入QPushButton,首先我们可以在Contents中寻找关键字 Signals,信号的意思,但是我们发现并没有找到,这时候我们应该想到也许这个信号的被父类继承下来的,因此我们去他的父类QAbstractButton中就可以找到该关键字,点击signals索引到系统自带的信号有如下几个

Qt学习第二课:信号量与槽_第1张图片

这里的clicked就是我们要找到,槽函数的寻找方式和信号一样,只不过他的关键字是slot。

Qt学习第二课:信号量与槽_第2张图片

 

2. 自定义信号和槽

          使用connect()可以让我们连接系统提供的信号和槽。但是Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。

现在写一个自定义信号和槽的小例子。

创建一个学生和老师的例子,下课后,老师发出饿了信号,学生打印“老师,吃饭了”字符串。

首先创建一个老师类和学生类,它们两个都继承了QObject对象。

然后老师类声明一个hungry信号,

学生类声明一个treat()函数进行处理,

信号不用实现,槽函数需要实现。

然后在Widget窗体类中,new一个老师类和学生类,设置父窗口为Widget窗口类。

接下来,开始连接信号和槽函数。

然后发送信号,观察输出结果。

Qt学习第二课:信号量与槽_第3张图片

Qt学习第二课:信号量与槽_第4张图片

你可能感兴趣的:(c/c++)