PyQt 예제 1.7.1

이번 글은 예전에 작성해 두었던 글을 다시 옮겨 두는 글이다. 글 내용은 시그널과 슬롯이 무엇인지에 대해 설명하는 것이다.

참고 문헌: Rapid GUI Programming with Python and Qt

PyQt 에서는 객체에 주어지는 신호를 시그널(Signal) 이라고 하며, 객체가 시그널에 대해서 호출하는 메소드나 함수를 슬롯(Slot)이라고 한다.

예를 들어서 버튼 객체가 있을 때 버튼을 "클릭"을 하게 되면 클릭에 해당되는 시그널을 버튼 객체에 보내게 되고, 객체는 그 시그널이 connect 를 통해서 연결되어 있다면 connect 에 있는 슬롯을 호출하게 된다.

시그널과 슬롯 관계 외에도 더 복잡하게 신호가 언제 발생 했고, 몇 번이고 얼마나 오랫동안 발생했는 지를 알 수 있는 방식도 있다.

이것은 로우 레벨 이벤트 처리 메커니즘(low-level event-handling mechanism)이고, 시그널과 슬롯은 하이 레벨 메커니즘이다. 로우 레벨 메커니즘은 훨씬 나중에 설명을 하고 이번 글에서는 시그널과 슬롯을 설명 하겠다.



PyQt 의 모든 위젯은 QWidget 을 상속하고 QWidget 이 QObject 를 상속하고 있기 때문에 QObject 의 시그널-슬롯 메커니즘을 사용할 수 있다. 그리고 PyQt 의 모든 위젯들은 미리 선언된 시그널들을 가지고 있다.

이것들은 PyQt 레퍼런스를 보면 아랫 부분에 시그널 부분이 있다.

일단, 위젯에 시그널이 발생을 하게 되면 PyQt 는 기본적으로 그 시그널을 버리게 된다. 시그널들을 잡기 위해서는 connect 메소드를 통해서 슬롯과 시그널을 연결해주어야 한다. 이때, 슬롯은 어떤 메소드나 함수여도 상관이 없다.
(C++ Qt 에서는 특별한 문법으로 정의되어야 한다.)



connect 를 쓸 때는 몇 가지 주의할 점이 있다. 먼저, SIGNAL() 에서 인자를 쓸 때, Qt 용 SIGNAL 은 인자 이름을 그대로 사용해도 되지만, const, & 는 사용을 하지 않아도 된다.

예를 들어서 const QString& 가 있을 경우 const 와 & 를 버리고 QString 만 써도 상관이 없다. 그러나 * 인자의 경우는 반드시 사용해야 한다.

다음으로, 시그널 인자의 개수와 슬롯 인자의 개수가 적절해야 한다. 즉, 슬롯 인자의 개수는 시그널 인자의 개수보다 항상 작거나 같아야 한다.

만약, 슬롯 인자의 개수가 시그널이 보내는 개수보다 많다면 슬롯에서는 인자가 부족하다고 오류를 낼 것이기 때문이다. 그러나 시그널이 보내는 개수가 많다면 슬롯은 추가적인 인자들을 버리게 된다.

또, 인자의 타입 또한 서로 맞아야 한다. 시그널이 텍스트를 보냈는데, 인자가 정수를 받으면 당연히 오류를 낼 것이기 때문이다.



마지막으로 시그널과 슬롯은 다대다로 연결 될 수 있다. 하나의 시그널이 여러 개의 슬롯과 연결될 수도 있고, 하나의 슬롯이 여러 개의 시그널과도 연결 될 수 있다.

그리고 위젯들이 connect 로 연결이 되듯이 disconnect 메소드를 통해서 연결을 해제할 수도 있다. 그러나 disconnect 는 위젯이 지워질 때 자동으로 호출이 된다.

댓글 없음:

댓글 쓰기