[Qt] Signal과 Slot

amudomolla·2023년 7월 6일
0

Qt

목록 보기
8/12

참고 서적


들어가기에 앞서 간단 설명


Qt는 모든 이벤트 처리를 시그널(Signal)과 슬롯(Slot)을 사용
.
버튼 클릭 👉 시그널(Signal)
시그널이 발생 시, 호출하는 함수 👉 슬롯(Slot)

  • Qt에 제공하는 모든 GUI 위젯은 미리 정해진 다양한 시그널을 가짐
    EX) QPushButton의 click, double click, mouse over 등

  • 시그널이 여러 개의 슬롯 함수를 호출 가능

  • 여러 개의 시그널이 하나의 슬롯 호출 가능


시그널과 슬롯 함수를 연결하는 함수 👉 QObject 클래스의 connect() 함수

  • 첫 번째 인자 : 이벤트가 발생한 오브젝트(클래스의 인스턴스)
  • 두 번째 인자 : 오브젝트의 시그널(이벤트)
  • 세 번째 인자 : 시그널과 호출할 슬롯 함수가 있는 오브젝트의 이름
  • 네 번째 인자 : 시그널 발생 시, 호출할 슬롯 함수

예제를 통해 자세히 알아보자


Example 과 Widget 이라는 두 개의 클래스가 존재한다고 가정

[Example.cpp]

...
class Example : public QObject
{
     Q_OBJECT  // Signal과 Slot 사용 시, Q_OBJECT 선언 필수
public:
   void setValue(int val) {
       emit valueChanged(val);
 }
signals:
    void valueChanged(int newValue);
    
private:
    int m_value;
};

시그널 함수

void valueChanged(int newValue);  // 시그널 함수
  • 시그널 함수는 구현부 없으며, 헤더에 정의부만 구현

  • 위의 예제에서는 시그널 함수에 int 인자를 명시했는데, 이 인자는 시그널 발생 시, 값을 슬롯 함수에게 인자로 전달하는 역할 (필요에 따라 인자를 사용하지 않거나 여러 개를 사용할 수도 있음)

멤버 함수

setValue()
  • 이 멤버 함수가 호출되면, 함수 내 emit 이 시그널을 발생시킴

[Widget.h]

...
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    QLabel *lbl;
 
public slots:
    void setValue(int val);
};

slots

public slots:
  • private 또는 public 과 함께 사용 가능

  • slots 라는 키워드를 사용하여 명시한 멤버 함수는 Slot 함수를 정의 가능


[Widget.cpp]

#include "widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    lbl = new QLabel("", this);
    lbl->setGeometry(10, 10, 250, 40);
    
    SignalSlot myObject;
    
    // New Style
    connect(&myObject, &SignalSlot::valueChanged, this, &Widget::setValue);
    
    /* Old Style
    connect(&myObject, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
    */
    
    myObject.setValue(50);
}

void Widget::setValue(int val)
{
    QString text = QString("시그널발생, Value:%1").arg(val);
    lbl->setText(labelText);
}

connect()의 두 가지 방식

// New Style
connect(&myObject, &SignalSlot::valueChanged, this, &Widget::setValue);
    
/* Old Style
connect(&myObject, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
*/
  • New Style
    1) Qt 5.5 이상 버전에서 추가된 방식
    2) 여러 개의 인자 사용 불가능
    3) Slot 함수 뿐만 아니라 일반 멤버 함수도 Slot 함수와 같이 connect() 함수에서 4번 째 인자로 사용 가능

예제와 깉이 Singal 과 Slot 함수는 다른 클래스에만 구현되어야 되는 것은 ❌

  • 동일한 클래스에 존재하는 Signal이 Slot 함수 호출 가능
  • Signal은 Slot 함수 외에도 Signal도 호출 가능
profile
👩‍💻 기록 및 복습을 위함

0개의 댓글