Qt5 - 3. 自定义信号&槽

信号&槽是 Qt 的核心特性之一,Qt 允许我们自定义信号&槽,因此我们可以在 Qt 程序中定义我们自己的信号&槽。要使用信号&槽,必须继承 QObject,并且必须在类定义添加宏 Q_OBJECT,这个宏提供很多操作,具体待查。

使用 Qt 的信号&槽完成观察者模式,实现报纸与订阅者,实现一个 NewspaperSubscriber 类,Subscriber 订阅 Newspaper,当 Newspaper 出现新内容时通知 Subscriber

newspaperandsubscriber.h

#ifndef NEWSPAPERANDSUBSCRIBER_H
#define NEWSPAPERANDSUBSCRIBER_H

#include <QObject>

class Newspaper : public QObject
{
    Q_OBJECT
public:
    explicit Newspaper(const QString &name);
    void send(const QString &content);

signals:
    void NewContent(const QString &content);

public slots:

private:
    QString newspaper_name_;
};

class Subscriber : public QObject
{
    Q_OBJECT
public:
    explicit Subscriber();
    void ReceiveNewspaper(const QString &name);

signals:

public slots:
};

#endif // NEWSPAPERANDSUBSCRIBER_H

newspaperandsubscriber.cpp

#include "newspaperandsubscriber.h"
#include <QDebug>

Newspaper::Newspaper(const QString &name) : newspaper_name_(name)
{

}

void Newspaper::send(const QString &content)
{
    emit NewContent(newspaper_name_ + ": " + content);
}


Subscriber::Subscriber()
{

}

void Subscriber::ReceiveNewspaper(const QString &name)
{
    qDebug() << "Receive newspaper:" << name;
}

main.cpp

#include <QCoreApplication>
#include "newspaperandsubscriber.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Newspaper newspaper1("paper1");
    Newspaper newspaper2("paper2");
    Subscriber subscriber;
    QObject::connect(&newspaper1, &Newspaper::NewContent, &subscriber, &Subscriber::ReceiveNewspaper);
    QObject::connect(&newspaper2, &Newspaper::NewContent, &subscriber, &Subscriber::ReceiveNewspaper);
    newspaper1.send("??");
    newspaper2.send("...");
    newspaper1.send("what?");

    return a.exec();
}

效果:

result.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、概述 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检...
    你的社交帐号昵阅读 45,419评论 0 9
  • 自定义信号槽 关于Q_OBJECT宏 只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必...
    WowBanyan阅读 4,885评论 0 0
  • 为什么在头文件中有的是使用前置声明,而有的是包含头文件? 如下代码: 前置声明(forward declarati...
    Joe_HUST阅读 1,329评论 0 6
  • 1.信号和槽 什么叫做信号,顾名思义,就是某一个物体被干了什么,而发出的一种消息,比如说一个按钮被鼠标点击了,那他...
    MisakaMikotoSAM阅读 7,539评论 0 5
  • 转自:作者简介作者:唐新华 (xhsmart@263.net)软件工程师    信号和槽作为QT的核心机制在QT编...
    njukay阅读 1,365评论 0 49