Qt信号槽

来源:互联网 发布:mac os x sierra bug 编辑:程序博客网 时间:2024/05/17 09:15

  • 信号槽简介
  • 自定义信号槽

信号槽简介

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


在 Qt 5 中, QObject::connect() 有五个重载,这里分析最常用的一种形式:
connect(sender, signal, receiver, slot);
connect() 一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。 也就是说, 当 sender 发出了 signal 信号之后, 会自动调用 receiver 的 slot 函数。
注意:信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致

自定义信号槽

例子:
有一个报纸类 newspaper,有一个订阅者类 reader。 reader 可以订阅 newspaper。这样,当 newspaper 有了新的内容的时候, reader可以立即得到通知。

//newspaper.h#ifndef NEWSPAPER#define NEWSPAPER#include <QObject>class Newspaper : public QObject{ Q_OBJECTpublic: Newspaper(const QString & name) : m_name(name) { } void send() { emit newPaper(m_name); }signals: void newPaper(const QString &name);private: QString m_name;};#endif // NEWSPAPER
//reader.h#ifndef READER#define READER#include <QObject>#include <QDebug>class Reader : public QObject{ Q_OBJECTpublic: Reader() {} void receiveNewspaper(const QString & name) { qDebug() << "Receives Newspaper: " << name; }};#endif // READER
//main.cpp#include "mainwindow.h"#include <QApplication>#include "newspaper.h"#include "reader.h"int main(int argc, char *argv[]){    Newspaper newspaper("Newspaper A");     Reader reader;     QObject:: connect(&newspaper, &Newspaper:: newPaper,     &reader,  &Reader:: receiveNewspaper);     newspaper. send();    return a.exec();}

当我们运行上面的程序时,会看到终端输出Receives Newspaper: Newspaper A这样的字样
解释:
1.发送者和接收者都需要是 QObject 的子类,并且都应该在第一行代码写上 Q_OBJECT宏;
2.信号就是一个个的函数名,返回值是 void(因为无法获得信号的返回值,所以也就无需返回任何值),参数是该类需要让外界知道的数据。信号作为函数名,不需要在 cpp 函数中添加任何实现;
3.emit 的含义是发出, 也就是发出 newPaper()信号;
4.main() 函数中,我们首先创建了 Newspaper 和 Reader 两个对象,然后使用QObject::connect() 函数,然后我们调用 Newspaper 的 send() 函数。这个函数只有一个语句:发出信号。由于我们的连接,当这个信号发出时,自动调用 reader 的槽函数,打印出语句。

0 0
原创粉丝点击