Signals & Slots

Qt에서 객체들 사이에 통신하는 방법으로 Signal과 Slot 매커니즘을 사용합니다.
이 매커니즘은 다른 프레임워크와 구별되는 Qt의 핵심입니다. 따라서 이 개념을 알아야 구현 코드의 동작을 이해할 수 있습니다.

특히 GUI 프로그램에서 버튼을 눌렀을 때 특정 동작을 구동시키기 위해서 필요한 매커니즘이라고 이해하면 쉬울 것입니다.
이런 구현을 ‘callback’이라고 합니다. 버튼이 눌리면 원하는 함수의 동작을 포인터로 넘겨줘서 동작시키는 방식입니다.
사용자에게 어떤 일이 벌어졌다는 것을 알려주는 함수를 processing 함수라고 한다면, callback 함수를 processing 함수에 알려주면 이벤트가 발생하면 processing 함수가 알아서 callback 함수를 호출해 줄 수 있습니다.

Qt에서 제공하는 callback 대용으로 특정 이벤트가 발생할 때, signal을 발생시킵니다.
Qt에서 제공하는 widget들은 저마다 미리 정의한 signal을 가지고 있습니다. 여러분이 직접 구현한 signal을 widget에 추가할 수도 있습니다.
slot은 특정 signal이 발생하면 호출되는 함수를 뜻합니다. Qt에서 제공하는 widget들에는 미리 정의된 slot이 있으며 여러분이 관심있는 signal을 처리하기 위해 직접 만든 slot을 추가할 수 있습니다.

따라서 signal & slot 매커니즘에서 signal을 slot에 connect시켰다면, slot은 signal의 parameter와 함께 호출됩니다.

QObject를 상속한 class들은 signal과 slot을 포함시킬 수 있습니다.
상태를 변경하는 객체가 signal을 발생시킵니다. 모든 객체들이 이렇게 통신합니다. 어떤 객체가 이 signal을 받을지 모르고 신경쓰지 않아도 됩니다.
slot은 signal을 받는데 사용하면서 일반 멤버 함수기도 합니다. 객체는 누가 signal을 받는지 모르는 것처럼, slot도 어떤 signal이 연결되어있는지 모릅니다. 이렇기에 독립적인 컴포넌트로 구현이 가능합니다.
단일 slot에 여러 signal을 연결할 수 있어서 하나의 signal을 여러 slot에 연결할 수 있습니다.
signal을 직접 다른 signal을 연결하는 것도 가능합니다.

Signal

signal은 접근 가능한 함수이며 어디서든 발생시킬 수 있지만 signal을 정의하고 있는 class나 subclass에서 발생시키는 것을 추천합니다.
signal이 발생되면 연결된 slot이 즉각 실행됩니다.
emit 구문에 있는 코드가 한 번 실행되고 모든 slot이 return됩니다.
여러 slot들 하나의 signal에 연결되어 있는 경우라면, signal이 발생하면 연결된 순서대로 slot들은 하나씩 실행될 것입니다.

Slot

slot에 연결된 signal이 발생하면 slot이 호출됩니다.
slot은 일반 C++ 함수로 일반적인 방식으로 호출됩니다.환
단 특징이 있다면 signal이 slot을 연결시켜야 한다는 것입니다.

 

Callback과 비교

속도를 비교하면 signal과 slot 구조가 callback보다 약간 느립니다. 내부적으로 signal과 slot구조를 위한 처리부분이 들어있기 때문입니다. 하지만 application 레벨에서 봤을 때 이 속도차이는 미미하다고 할 수 있습니다.

[개발] QGroundControl를 위한 Qt – Signal & Slot

답글 남기기