참고 서적
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);
};
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);
}
// New Style
connect(&myObject, &SignalSlot::valueChanged, this, &Widget::setValue);
/* Old Style
connect(&myObject, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
*/
예제와 깉이 Singal 과 Slot 함수는 다른 클래스에만 구현되어야 되는 것은 ❌
- 동일한 클래스에 존재하는 Signal이 Slot 함수 호출 가능
- Signal은 Slot 함수 외에도 Signal도 호출 가능