본문 바로가기

Programming/QT&QML

[QT, QML] Signals Slots 사용하기

728x90
반응형
# QT Version : 5.12 
# QT Creatpr Version : 4.11
# Project name : SignalSlot

My_Github_Link

 

jungmonster/qt_study_project

Qt projects for my study. Contribute to jungmonster/qt_study_project development by creating an account on GitHub.

github.com

Qt에는 Signal Slot 이란 개념이 있다.

Qt Signal Slot Document

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에서 받는 것도 확인할 수 있다.

 

반응형