Signal을 Slot에게 연결하는 방법
connect() / disconnect()
시그널 슬롯을 사용하려면 의무적으로 Q_OBJECT 매크로를 적어야한다.
또한 Source file에 Meta Object Compiler를 실행해야한다.
Qt에서는 실제로 Signal Slot사용 여부와 상관없이 Q_OBJECT매크로 사용을 권장한다.
예제) 라벨이 현재 scroll bar의 값 보여주기
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QOjbect::connect(scrollBar, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int)));
SIGNAL(), SLOT() 매크로를 항상 사용해야한다.
예제) 잘못된 방법 예시 : 파라미터 변수 이름 넣지않기
// WRONG
QObject::connect(scrollBar, SINAL(valueChanged(int value)),
label, SLOT(setNum(int value)));
Signal slots 의 파라미터는 변수이름을 포함하면 안된다! 위의 예시처럼 int value 틀림!
예제) 시그널을 또 다른 시그널에 연결
class MyWidget : public QWidget
{
Q_OBJECT
public :
MyWidget();
signals :
void buttonClicked();
private :
QPushButton *myButton;
};
MyWidget::MyWidget()
{
myButton = new QPushButton(this);
connect(myButton, SIGNAL(clicked()),
this, SIGANL(buttonClicked()));
}
하나의 시그널은 많은 slots과 signals에 connect될 수 있다. 많은 시그널은 하나의 slot에 connect될 수 있다.
만약 하나의 시그널이 다수의 slots에 connect된다면, // A signal -> Slots
시그널이 발생할 때 slots은 만들어진 순서대로 activated된다.
시그널 슬롯이 성공적으로 connect되면 handle을 보여주는 QMetaObject::Connection을 반환한다.
만약 connection이 만들어질 수 없으면, connection handle은 유효하지않다.
connection이 만들어질 수 없는 경우 ex)
QObject가 signal이나 method의 존재를 확인할 수 없는 경우
그들의 signatures들이 양립할 수 없는 경우
=> handle을 bool로 캐스팅해서 체크할 수 있음
예제) slot function만들기
void someFunction();
QPushButton *button = new QPushButton;
QOjbect::connect(button, &QPushButton::clicked, someFunction);
시그널은 헤더에서 시그널로서 선언되어야만한다.
slot함수는