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 =====
*/