본문 바로가기
Solution/Qt Programming

[Qt] Signal, Slot, and Connect

by 이센 2023. 7. 22.

기존 Frame Work 와 다르게 Qt 는 Signal, Slot 이라는 Object 와 Object 사이에 정보를 전달하고 받는 함수를 제공하고 이를 연결해주는 Connect 함수를 제공한다.

 

간단히 QWidget Application 을 하면 아래와 같은 기본 환경이 만들어진다.

그리고 source 파일에, C++ Class "sender.cpp" 를 만든다. 그럼 자동으로 sender.h 를 만들겠냐고 묻는데, Yes를 하고 그대로 진행한다. 비슷하게 "receiver.cpp" 과 "receiver.h" 파일도 만들자.

 

 

이렇게 파일들이 생성되고 Build 를 한번 해보면, 빈 윈도우 하나를 띄우며 Compile 도 잘 수행되는 것을 볼 수 있다.

 

이제 sender.h 로 가서 sender class 의 코드를 작성해보자. 초기 화면은 아래와 같다.

 

sender 

#ifndef SENDER_H
#define SENDER_H

#include <QObject>

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

signals:
    void senderSignal();

};

#endif // SENDER_H

sender.h 와 비슷하게 이번에는, signal 을 받는 부분인 slot 기능을 하는 receiver.h 를 작성한다. 여기서는 receiver class 내에 public slot: 에 receiverSlot() 함수를 만든다. 간단한 string 값을 출력하기 위해 <QDebug> 를 선언했다.

#ifndef RECEIVER_H
#define RECEIVER_H

#include <QObject>
#include <QDebug>

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

signals:
    
public slots:
    void reciverSlot();

};

#endif // RECEIVER_H

Qt Creator에서 함수를 클릭하면 메뉴가 나타나고, 여기서 Refector를 선택하면 친절하게도 해당 함수를 구현하기 위한 코드도 작성해준다. 

 이렇게 receiver.cpp 에 간단히 slot을 실행하기 위한 함수를 작성한다.

#include "receiver.h"

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

void receiver::receiverSlot()
{
    qInfo() << "Executing slot from" << this;
}

이제 main.cpp 로 가서, signal 을 생성하고 slot 을 연결시키는 부분을 작성한다.

그전에 이전 class 를 작성하면서 class 이름을 소문자로 하였는데, 문법상 문제는 없지만 자주 비슷한 이름을 갖는 클래스 변수를 사용하는 일이 많기 때문에 대부분의 프로그래머들은 class 를 대문자로 시작하게 이름을 만든다. 우리도 일반적인 원칙을 따라서 class 의 첫 알파벳을 대문자로 Update 하자! 

 

header 의 클래스 이름을 바꾸자 마자, 아래와 같이 똑똑하게 메세지를 보내준다. 나머지도 마저 고쳐주자.