본문 바로가기
SWE/Qt

[Qt] Signal Slot의 Connect 다양한 예시

by S나라라2 2019. 8. 19.
반응형

 

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함수는 

 

 

https://doc.qt.io/qt-5/qobject.html#connect

반응형