Python/파이선과 친해지기

[Python] - Python과 예쁘게 친해지기-QApplication과 EVENTLOOP

아직 우리는 기초단계에 있기 때문에 지난 글을 읽고 오지 않으셨다면 꼭 읽고 와주시기를 바란다.

2021.08.27 - [Python/파이선과 친해지기] - [Python] - Python과 예쁘게 친해지기-PyQt

 

[Python] - Python과 예쁘게 친해지기-PyQt

오랜만에 Python과 친해지기 강의를 쓰기 위해 키보드를 잡았다. 사실 이 정도면 Python에서 사용되는 대부분의 용어나 개념을 설명했다고 생각하는데, client 프로그램을 만들기 위한 QT Library를 다

tutoreducto.tistory.com

 

## myqt.py

from PyQt5.QtWidgets import QApplication, QWidget, QLabel
import sys

if __name__ == "__main__" :
    app = QApplication(sys.argv)
    first_window = QWidget()
    first_window.show()
    app.exec_()

우리가 지난시간 작성한 코드다. 이름대로 기 때문에 다 어떤 동작을 하는지 대충 예상할 수 있는데, 특이한 인스턴스가 하나 보인다.

 

"QApplication"

 

얘는 뭐하는 애일까?


QApplication과 EVENT

 

"QApplication은 Q-Widget 기반의 애플리케이션 기능을 포함한 QGuiApplication의 특수한 형태입니다. QApplication은 위젯의 초기화 / finalization을 처리합니다."

- qt공식 홈페이지 : https://doc.qt.io/qt-5/qapplication.html#details -

 

말이 조금 어려운데, 결국  Q-Widget이 동작하기 위한 기반 위젯이 QApplication이다. 요놈은 다른 QWidget의 생성 / 전시 / 삭제를 처리한다. 우리의 앱에서 최초의 QWidget이 나오기 전에 QApplication이 있어야 하는 이유가 바로 QApplication이 QWidget의 생성을 담당하기 때문이다.

 

한 프로그램에는 QApplication은 한개만 존재한다. 창이 2개 이상이 되더라도 QApplication은 하나만 존재한다.(음.... Python형 싱글턴 객체라고 볼 수 있겠다.) 여담으로 Qt기반의 Widget이 아닌 경우에 저기 정의에 있는 QGuiApplicatio을 사용한다. 홈페이지에 나와있는 기능은 또한 다음의 것들도 처리하는 것으로 적혀있다. 의역하니, 원문을 보고 싶은 사람은 위 qt공식 홈페이지를 방문하자(여기는 Qt가 C++형태이니 함수명이나 클래스명은 그냥 참고만 하자)

  • palette(), font()와 doubleclickInterval()등의 데스크탑 세팅을 초기화한다. 또한 제어판 설정 같은 데스크톱 세팅을 추적하고 반영한다.
  • 이벤트 처리를 담당한다. 관련된 widget에서 이벤트를 송/수신한다. 사용자는sendEvent()와 postEvent()를 위젯에 사용하여 자신만의 이벤트를 전송한다.
  • Command line 인자를 파싱하고 적절하게 초기화한다.-> 요래서 QApplication에 sys.argv가 인자로 들어가는 ㅋㅋ루삥뽕이다.
  • QStyle()으로 애플리케이션의 디자인을 설정한다. setStyle()로 이건 변경할 수 있다.
  • trainslate()기능을 이용해서 지역 언어로 설정할 수 있다.
  • desktop()이나 clipdoard()등을 이용해서 매지컬 오브젝트를 사용한다.
  • QApplication은 widget의 정보를 추적한다. 즉 widgetAt()으로 위치도 가져오고 topLevelWidget()으로 리스트도 가져오고 한다.
  • setOverrideCursur()매서드를 이용해서 애플리케이션의 마우스 움직임을 처리한다.

 

두 번째 기능에 집중해보자. QApplicationd은 이벤트 처리를 담당한다고 한다. 이벤트는 무엇이고 이걸 어떻게 처리한다는 것인가? 


이벤트

 

이벤트는 dispatch 되는 신호이다. 구현은 QEvent()라는 객체를 상속받아 구현되는데, 외부의 자극(유저의 입력 / 프로그램의 움직임 등 겁나 광범위하다.)과 그에 대하 한 결과로 이루어져 있다. 당연하게도 프로그램을 사용하면 엄청나게 많은 이벤트들이 발생한다. 그걸 정확하게 처리하는 기술이 바로 Event Loop이다. QT에는 이벤트 큐(Event Queue)라는 자료구조가 존재한다. 이벤트는 발생된 순서대로 이 Event Queue에 push 한다. QApplication은 이 이벤트 큐를 무한루프 하며 이벤트를 하나하나 처리한다. 큐에 저장된 Event는 Event Handler에 의해 수집되며 이벤트를 accept 할지 ignore 할지를 판단한다. 결정하면 Event를 받는 slot에 정의된 기능에 따라 Event는 처리되고, 다음 Event를 검사한다.


이론적인 이야기가 많았다. 물론 이걸 몰라도 GUI 프로그래밍을 할 수는 있지만 한 단계 높은 성장을 위해서는 필수적으로 알아야 하는 내용이라 적어두었으니, 꼭 관심 가지고 읽어주시기 바란다. 다음 시간에는 드디어 우리의 QWidget을 조금 발전시켜보자.