728x90
반응형
# QT Version : 5.12
# QT Creatpr Version : 4.11
# Project name : SignalSlot
Qt에는 Signal Slot 이란 개념이 있다.
Signal-Slot은 아래 내용 정도로 정리할 수 있을 것 같다.
- meta-object system를 사용하는 Qt의 핵심 메커니즘
- 다른 toolkit의 call-back과 비슷 하지만 보다 안전한 mechanism으로 type safe 하다.
- QObject를 상속하는 클래스는 signal, slot을 사용 가능
- Signal, Slot으로 object 간 communication 방법이며, 이를 통해 진정한 정보 캡슐화가 가능함
- 특정 Object의 signal이 emit 되면 연결된 slot 함수가 즉시 실행된다.
- 하나의 signal에 여러 개의 slot 연결이 가능하며, 이땐 순차적으로 실행된다.
- slot은 일반적인 멤버 함수로, C++ 규칙을 따른다.
- signal-slot은 call-back보다 10배 정도 느리다.(하지만 그 만한 가치가 있다)
간단하게 Qt Console Application으로 프로젝트를 하나 생성 후 Counter Class를 하나 만든다.
그리고 valueChanged() signal과 setValue() slot을 하나 만든다.
Counter.h
#include <QObject>
#include <iostream>
using namespace std;
class Counter : public QObject
{
Q_OBJECT
public:
Counter(string name); // object instance를 구분하기 위해 생성자에서 구분하기 위한 이름을 받는다.
int value() const ;
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value; //
string obj_name = "";
};
Counter.cpp
#include "counter.h"
Counter::Counter(string name)
{
this->m_value = 0;
this->obj_name = name;
}
int Counter::value() const
{
return m_value;
}
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
cout << obj_name << " : value " << this->m_value << endl;
emit valueChanged(value);
}
}
main 함수에서 a1의 valueChanged() signal과 b1의 setValue() slot을 connect 해준다.
#include <QCoreApplication>
#include <QObject>
#include "counter.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Counter *a1 = new Counter("obj_a1");
Counter *b1 = new Counter("obj_b1");
QObject::connect(a1, &Counter::valueChanged, b1, &Counter::setValue);
a1->setValue(12);
cout<< "-------------" << endl;
a1->setValue(48);
return a.exec();
}
실행 결과
확인해보면 a1의 setValue로 값을 세팅하고 emit valueChanged()로 시그널을 발생시키면 b1의 setValue가 호출되는 걸 확인할 수 있다.
그리고 a1에서valueChagned()로 전달 한 값을 b1에서 받는 것도 확인할 수 있다.
728x90
반응형
'Programming > QT&QML' 카테고리의 다른 글
[QT, QML] MVC 패턴으로 구현 (0) | 2020.04.13 |
---|---|
[QT, QML] Signal, Slot 동기(synchronous), 비동기(Asynchronous) ynchronous), 비동기(Asynchronous) 작업 (0) | 2020.04.12 |
[QT, QML] QML Component anchor (0) | 2020.04.06 |
[QT, QML] Translation 사용 (0) | 2020.04.03 |
[QT, QML] QML Component load 순서 (0) | 2020.03.31 |