Qt 自定义信号槽
【摘要】
使用 connect() 可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。
信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普...
使用 connect() 可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。
信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。
经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类 Newspaper,有一个订阅者类 Subscriber。Subscriber 可以订阅 Newspaper。这样,当 Newspaper 有了新的内容的时候,Subscriber 可以立即得到通知。在这个例子中,观察者是 Subscriber,被观察者是 Newspaper。在经典的实现代码中,观察者会将自身注册到被观察者的一个容器中(比如 subscriber.registerTo(newspaper))。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者(newspaper.notifyAllSubscribers())。
下面我们看看使用 Qt 的信号槽,如何实现上述观察者模式。注意,这里我们仅仅是使用这个案例,我们的代码并不是去实现一个经典的观察者模式。也就是说,我们使用 Qt 的信号槽机制来获得同样的效果。
-
-
//!!! Qt5
-
#include <QObject>
-
-
// newspaper.h
-
class Newspaper : public QObject
-
{
-
Q_OBJECT
-
public:
-
Newspaper(const QString & name) :
-
m_name(name)
-
{
-
}
-
-
void send()
-
{
-
emit newPaper(m_name);
-
}
-
-
signals:
-
void newPaper(const QString &name);
-
-
private:
-
QString m_name;
-
};
-
-
// reader.h
-
#include <QObject>
-
#include <QDebug>
-
-
class Reader : public QObject
-
{
-
Q_OBJECT
-
public:
-
Reader() {}
-
-
void receiveNewspaper(const QString & name)
-
{
-
qDebug() << "Receives Newspaper: " << name;
-
}
-
};
-
-
// main.cpp
-
#include <QCoreApplication>
-
-
#include "newspaper.h"
-
#include "reader.h"
-
-
int main(int argc, char *argv[])
-
{
-
QCoreApplication app(argc, argv);
-
-
Newspaper newspaper("Newspaper A");
-
Reader reader;
-
QObject::connect(&newspaper, &Newspaper::newPaper,
-
&reader, &Reader::receiveNewspaper);
-
newspaper.send();
-
-
return app.exec();
-
}
文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。
原文链接:yujiang.blog.csdn.net/article/details/72841146
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)