logo MSJO.kr

Qt/C++, Signals & Slots

2020-04-25
MsJ
   

QT의 핵심기능 중 하나인 Signal, Slot은 객체 간의 통신에 사용된다. 일반적인 개발언어의 객체 간 메시지 통신인 ‘메시지-메시지 핸들러’, ‘이벤트-이벤트 핸들러’와 유사한 개념이다. signal과 slot을 연결하기 위해 connect()를 사용한다. connect를 사용하는 방법은 함수 포인터를 사용하거나 람다에 연결한다. Singleton으로 확장한 예제는 여기(GitHub)에서 볼 수 있다.

connect() 함수 형식
connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
connect(sender, &QObject::destroyed, this, [=](){this->m_objects.remove(sender);});
Console 예제
//main.cpp
#include "water_cooler.h"
#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    WaterCooler Cooler;
    a.exit(0);
}
person.h
#ifndef PERSON_H
#define PERSON_H

#include <QObject>
#include <QString>
#include <QtDebug>

class Person : public QObject
{
    Q_OBJECT
  public:
    explicit Person(QObject *parent = nullptr);

    QString Name;
    void Gossip(const QString &words);

  signals:
    void Speak(const QString &words);

  public slots:
    void Listen(const QString &words);
};

#endif // PERSON_H
person.cpp
#include "person.h"

Person::Person(QObject *parent) : QObject(parent){}

void Person::Gossip(const QString &words)
{
    qDebug() << Name << " says " << words;
    emit Speak(words);
}

void Person::Listen(const QString &words)
{
    qDebug() << Name << " says someone told me... " << words;
}
water_cooler.h
#ifndef WATER_COOLER_H
#define WATER_COOLER_H

#include <QObject>

class WaterCooler : public QObject
{
    Q_OBJECT
  public:
    explicit WaterCooler(QObject *parent = nullptr);
    ~WaterCooler();
};

#endif // WATER_COOLER_H
water_cooler.cpp
#include "water_cooler.h"
#include "person.h"

WaterCooler::WaterCooler(QObject *parent) : QObject(parent)
{
    qDebug() << "===== Init =====";

    Person Cathy;
    Person Bob;
    Person Sally;
    Cathy.Name = "CCC";
    Bob.Name = "BBB";
    Sally.Name = "SSS";

    connect(&Cathy, SIGNAL(Speak(QString)), &Bob, SLOT(Listen(QString)));
    connect(&Cathy, SIGNAL(Speak(QString)), &Sally, SLOT(Listen(QString)));

    Cathy.Gossip("BALD");
}

WaterCooler::~WaterCooler()
{
    qDebug() << "===== Exit =====";
}

/* 실행결과
===== Init =====
"CCC"  says  "BALD"
"BBB"  says someone told me...  "BALD"
"SSS"  says someone told me...  "BALD"
===== Exit =====
*/
Reference

Prεv(Θld)   Nεxt(Nεw)
Content
Search     RSS Feed     BY-NC-ND