본문 바로가기
SWE/Qt

[Qt심화] Qt 내부에서 Event 처리방식 | Qt의 이벤트 시스템

by S나라라2 2020. 3. 4.
반응형

Qt를 개발하다보면, 왜 여기서 A event가 아니라 B이벤트가 먼저 처리되지? 왜 B 이벤트에서 약간의 지연이 있는거지 이런 의문사항이 들 때가 있는데 Qt 내부적 시스템을 알면 명쾌해지는 것 같다. 유레카~

 

 

  • Qt에서 이벤트란

Qt에서 events는 object이고, 프로그램 내에서 일어나는 것을 보여주거나 프로그램 외부 결과 중 알아야할 필요가 있는 것을 보여주는 것이다.

이벤트들은 QObject의 서브클래스의 instance로부터 전달받고 처리되어진다.

그러나 이벤트들은 특히 위젯들과 관련이 있다.

 

아래에서는 전형적인 어플리케이션에서 어떻게 이벤트들이 전달되고 처리되어지는지 다루어볼 것이다.

 

 

  • 이벤트 전달 방식

이벤트가 발생했을 때, Qt는 event object를 생성한다. 그리고 event() 함수를 호출하여 특정한 QObject 인스턴스로 전달한다. 그리고 event() 함수는 자체적으로 event를 처리하지 않고, 이벤트 타입에 따라 event handler를 호출한다. 

 

 

  • 이벤트 종류 3가지

- 자발적인(Spontaneous)이벤트 : 윈도우 시스템에 의해 생성된다. 시스템 큐에 들어가서 차례대로 처리된다. 

- 게시된(Posted) 이벤트 : Qt 또는 프로그램 내에서 생성된다. 시스템 큐에 들어가서 차례대로 처리된다.

- 보내는(Send) 이벤트 : Qt 또는 프로그램 내에서 생성된다. 시스템 큐를 거치지 않고 즉시 처리된다.

 

예시

윈도우 시스템으로부터 발생하는 이벤트 : QMouseEvent, QKeyEvent

프로그램 내부에서 발생하는 이벤트 : QTimerEvent

 

 

  • 이벤트 루프

시스템 큐에 들어간 이벤트들은 "이벤트 루프"에서 처리된다.

이벤트 루프는 프로그램이 '실행'할 때 함께 실행된다. 즉, QApplication::exe()가 호출될 때 응용프로그램 백그라운드에서 실행되는 것이 이벤트 루프다.

 

이벤트 루프는 다음과 같은 순서로 이벤트들을 처리시킨다.

// 이벤트 루프의 수도코드

while ( !exit ) {

   while ( !posted_event_queue_is_empty) { // (1)

      process_next_posted_event();

   }

   while ( !spontaneous_event_queue_is_empty) { // (2)

      process_next_spontaneous_event();

   }

   while ( !posted_event_qeueu_is_empty) { // (3)

      process_next_posted_event();

   }

}

(1) posted 이벤트 큐가 빌 때(empty)까지 posted 이벤트를 우선적으로 처리하고,

(2) spontaneous 이벤트 큐가 빌 때(empty)까지 spontaneous 이벤트를 처리한다.

이 때, 이벤트들이 처리되면서 새로운 이벤트들로 변환되어 다시 post 큐에 들어가게 되고

(3) spontaneous 이벤트들에 의해 다시 채워진 이벤트 큐를 처리하며 이벤트 루프를 완료하게 된다.

 

 

  • Event Filter

 

 

참고 링크 : Qt 공식 문서(https://doc.qt.io/archives/qt-4.7/eventsandfilters.html)

우연히 찾은 햇살같은 링크(https://kbdyj.tistory.com/entry/Qt-%EC%97%90%EC%84%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0)

반응형