본문 바로가기
GUI 튜토리얼/PySide6 # Qt의 원조가 돌아왔다!

[3/?] PySide6에서 가장 기초가 되는 QApplication과 QWidget

by 일코 2021. 3. 19.

PySide6에서 가장 기초가 되는 두 가지 클래스, QApplication과 QWidget

안녕하세요? 회사원코딩입니다.

이번 포스팅에서 설명드릴 코드는 가장 단순한 창만들기입니다. 임포트문을 제외하면 네 줄밖에 아닌데요. 라인별로 설명드리고 포스팅을 마치겠습니다.

import sys
from PySide6.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)
window = QWidget()
window.show()
app.exec_()

위의 코드를 실행해보겠습니다.

가장 단순한 Qt 코드. 빈 창을 생성합니다.

라인별로 설명드리겠습니다.


[1] import sys

파이썬 내장모듈인 sys 를 임포트합니다. sys가 쓰이는 곳은 딱 하나인데, QApplication클래스로 app 인스턴스를 생성할 때 파라미터로 사용했습니다.

sys.argv가 뭔지 모르시는 분들도 많을 거라고 생각합니다. 아래 예제를 보면 쉽게 이해하실 겁니다.

프로그램 실행시 뒤에 인자값을 붙이고, sys.argv로 프로그래밍 내에서 전달받는 방법([0]은 파일명임)

이런 식으로 커맨드프롬프트상에서 프로그램을 실행할 때 파일명 뒤에 붙인 인자들을 프로그램 내부에서 활용할 수 있습니다. 순전히 이 용도일 뿐이어서, import sys 구문을 빼고 app = QApplication()처럼 괄호 안에 아무것도 넣지 않아도 실행이 됩니다. 다음에 sys.argv를 활용하는 코드를 보여드리겠습니다.


[2] from PySide6.QtWidgets import QApplication, QWidget

Qt GUI를 구성하는 다양한 부품(위젯)들은 모두 QtWidgets 모듈 안에 들어 있습니다. 우리는 그 중에 QApplication과 QWidget 등 두 개의 클래스를 사용할 것입니다. 단순한 임포트 구문입니다.

[3] app = QApplication(sys.argv)

QApplication은 우리가 제작한 GUI를 움직이게 해주는 클래스라고 생각합시다. 좀 더 직관적으로는 exec_()라는 메서드(C++에서는 exec)를 실행해서 Qt의 시그널과 슬롯이 상호작용하게끔 이벤트루프를 시작하는 클래스입니다. 프로그램 내에서 꼭 한 번 실행되어야 하며, 한 개의 인스턴스만 존재할 수 있습니다. (singleton이기 때문에 두 번 이상 인스턴스화를 하려고 하면 런타임에러가 발생합니다.)

일반적으로 app = QApplication()이라는 컨벤션으로 인스턴스를 생성합니다. 안에 있는 sys.argv에 대해서는 나중에 sys.argv를 사용하는 GUI 튜토리얼로 상세히 설명드리겠습니다.


[4] window = QWidget()

우리의 GUI창이 되는 Qt위젯을 만들었습니다. 이 QWidget은 그냥 제목줄이 하나 있는 빈 창 위젯을 생성합니다. 이 안에다 이것저것 다른 위젯이나 레이아웃을 넣을 수도 있고, 심지어 아무 것도 안 넣어도 실행됩니다. 지금처럼요. 제목을 설정하지 않으면 "python"이 입력되어 있습니다. 당분간은 이 QWidget 안에다가 이것저것 다른 위젯을 넣는 방식으로 튜토리얼을 진행해볼 예정입니다. 이와 비슷한 위젯으로는 QMainWindow라는 게 있는데 제목줄 아래로 메뉴바나 아이콘탭을 추가한다든지 하단에 정보표시줄을 추가한다든지 하는 각종 요소를 추가할 수 있습니다. 단순한 프로그램을 짤 때는 QWidget, 좀 더 체계적으로 여러 기능이 들어가는 프로그램의 GUI를 짤 때는 QMainWindow를 쓰시면 되겠습니다. 당분간은 QWidget만 써도 충분할 것 같네요. 하여튼 window라는 변수명으로 QWidget 클래스의 인스턴스를 생성했습니다. 3번라인의 QApplication은 싱글턴이지만 QWidget은 아니므로, 한 개의 Qt 프로그램 안에 여러 개의 QWidget 윈도우를 생성하는 건 가능합니다.

여러 개의 QWidget 인스턴스를 생성하는 것은 가능합니다.


[5] window.show()

QWidget이든 MainWindow든 기본적으로 백그라운드에서 실행되며, 창을 나타나게 하려면 무조건 show() 메서드를 실행해야 합니다. 여기까지만 실행하면 아래와 같은 창이 나타나며, 응답없음 상태입니다. 창 크기를 

창은 나타났는데, 아직 응답없음 상태입니다. app.exec_()를 실행해야 이벤트루프가 시작됩니다.


[6] app.exec_()

이 명령어를 실행하는 시점에서 우리가 만든 GUI 윈도우가 반응하고 움직이기 시작합니다. 대부분 이 라인이 코드의 마지막입니다. 창을 닫고 이벤트루프가 종료된 이후에 추가로 실행하고 싶은 내용이 있다면 이 뒤로 코드를 작성하시면 됩니다.


마무리

이번 예제 설명은 여기서 마치겠습니다. 거창하게 시작했는데 만들어진 창 안에 아무 것도 없어서 다소 실망하셨을지도 모르겠습니다. 단순한 위젯 하나씩 만들어보는 작업을 통해서, QApplication이나 기타 QtWidgets 안의 여러가지 요소들에 익숙해지는 과정을 같이 따라하시다 보면 코드의 뼈대가 어떤 식으로 잡히는지, 또 나아가 어떤 방식으로 코드를 짜야 할지 감이 올 겁니다. 내공을 쌓는 작업이라고 생각하시고, 마음을 넉넉하게 가지시면 좋겠습니다.

다음 시간에는 상호작용의 가장 기본이 되는 버튼, 바로 PushButton 위젯에 대해 소개하겠습니다.

다음 포스팅에서 뵙겠습니다^^

 


국내 유일의 파이썬+한컴오피스 업무자동화 입문강의

 

움짤로 빠르게 배우는 파이썬-아래아한글 자동화 레시피 - 인프런 | 강의

파이썬으로 아래아한글을 다루는 짧은 예제코드들을 소개하고, 중간중간의 결과를 GIF로 보여드립니다. 동영상 강의가 아니지만 오히려 빠르게 배울 수 있고, 따라하기도 쉽습니다., - 강의 소개

www.inflearn.com

 

댓글