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 的槽函数,打印出语句。
- Qt 信号与信号,信号与槽
- QT---QT的信号槽
- qt 槽与信号
- QT信号与槽
- Qt信号和槽
- QT 信号与槽
- QT信号和槽
- QT信号槽
- QT信号和槽
- QT信号与槽
- Qt信号与槽
- QT信号槽
- QT 信号和槽
- Qt ---- 信号和槽
- Qt 之 信号槽
- Qt信号与槽
- QT信号和槽
- QT信号与槽
- MFC实现程序托盘
- ORA-01461:仅能绑定要插入 LONG 列的 LONG 值
- 简析Android的垃圾回收与内存泄露
- HBase使用场景和成功案例 (转)
- Linux时间函数之 gettimeofday() 函数之使用方法
- Qt信号槽
- 多线程底层的实现
- hbase shell基础和常用命令详解(转)
- 什么是P问题、NP问题和NPC问题
- HBase体系结构(转)
- HBase Java API类介绍
- (多线程)TheadDemo1
- HDU 1076An Easy Task
- 原型模式