Qt

Qt Signal / Slot

끄적a 2020. 12. 31. 17:11

Qt는 이벤트 처리를 Signal과 Slot로 한다. 

connect(object1, signal, object2, signal)

object1 : 이벤트가 발생하는 object

signal : 시그널 종류(ex, click, move 등)

object2 : slot가 있는 object

slot : 시그널 발생시 호출될 함수 

 

아래는 SignalSlot에 customSignal이 발생이 되면 Widget에 setValue slot이 호출되는 예제이다 .

(customSignal을 발생 시키기 위해 occuredSignal함수에서 emit으로 signal을 발생 시킨다.)

 

header파일

class SignalSlot : public QObject
 {
     Q_OBJECT

 public:
    void occuredSignal(int val) {
        emit customSignal(val);
    }

 signals:
     void customSignal(int val);

 private:
     int m_value;
};

//------------------------------------------

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    QLabel *lbl;

public slots:
    void setValue(int val);

};

signal과 Slot을 사용하기 위해서는 Q_OBJECT 를 선언해주어야 한다.

signal은 "signals:" 에 선언 하면 된다. signal의 경우 선언만 해주고 구현은 안해줘도 된다. 

slot도 "slots:"에 선언해주면된다.

 

구현 파일

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    lbl = new QLabel("", this);
    lbl->setGeometry(10, 10, 250, 40);
    SignalSlot signalSlot;
    connect(&signalSlot, &SignalSlot::customSignal, this, &Widget::setValue);
    signalSlot.occuredSignal(50);
}


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

SignalSlot의 인스턴스를 signalSlot로 만듬. 

connect에서 signalSlot의 customSignal이 호출이 되면 Widget의 setValue가 호출되도록 설정

signalSlot.occuredSignal(50); 을 통해 customSignal을 발생

Signal이 발생되면 Widget의 setValue가 호출이 됨