QMainWindow를 소개드리기 전에
안녕하세요? 회사원코딩입니다.
최근 튜토리얼에서는 PySide6(Qt)로 창을 생성하는 최소한의 코드를 보여드렸습니다.
from PySide6.QtWidgets import QApplication, QWidget
app = QApplication()
window = QWidget()
window.show()
app.exec_()
위 코드에서는 QWidget이라는 클래스 하나만 가지고 GUI 창을 생성해보았습니다. 그리고 정상적으로 잘 실행되는 것을 확인했어요. 근데 재미있는 건, 창을 생성할 수 있는 위젯이 QWidget이나, 다음 포스팅에 소개드릴 QMainWindow 뿐만 아니라, 다른 위젯 하나만 가지고도 창을 생성할 수 있다는 걸 보여드리려고 합니다.
각종 부품(위젯)으로 완성품을 만들어야만 GUI윈도우가 되는 게 아니고,
부품 한 개(QPushButton, QLabel 등)만으로도 윈도우를 만들 수 있습니다.
예를 한 번 보여드릴게요.
파이참으로 위 코드의 QWidget을 QPushButton으로 바꿔보겠습니다.
(참고로 파이참에서 찾아바꾸기는 Ctrl-r입니다.)
이대로 실행하면 어떤 모양의 창이 나올까요?
하여튼 실행에는 문제가 없네요. 사이즈나 버튼의 텍스트가 없는 점이 약간 어색하긴 하지만요.
그럼 이 시점에서 한 개의 위젯을 가지고 GUI창을 만드는 건 여러분 거의 마스터하신 거예요.
위젯별로 필요한 옵션은 문서를 참고하셔도 되고요.
파이참으로는, 메서드 부분에 캐럿을 놓고 Ctrl-q를 눌러 Quick Documentation을 읽으시거나,
간단히 괄호 안에 캐럿을 두고 Ctrl-p를 눌러 파라미터 옵션을 보셔도 돼요.
(삼천포로 빠지는 느낌이지만) 위의 정보를 참고해보면 QPushButton에 들어갈 수 있는 인자가 세 가지 있는데,
icon(QIcon객체), text:(문자열), parent:(QWidget 등)
이라는 정보를 알 수 있었네요. 이걸 다 집어넣는 것도 절대 복잡한 작업이 아니어서 한 번 보여드리겠습니다.
(따라하지 않으셔도 돼요.)
1. icon(QIcon객체)
icon 인자에 들어갈 파라미터로는 QIcon이 나와야 한다고 하는데, IDE를 안 써보신 분들은 문서 하나하나 읽으면서 모듈 경로를 고생해서 찾으시는데, 다행히 여러분은 파이참을 쓰고 계시니까, 간편한 방법을 알려드릴게요. 우선 임포트를 했다고 생각하고 코드를 완성해버리는 거예요. 그리고 나서 마법의 자동완성기능인 Alt-Enter를 쓰는 거죠.
파이참으로 처음 프로젝트 만들 때 모든 모듈을 인덱싱하는 데 시간이 많이 걸리죠.
특히 아나콘다 까셨으면 백그라운드작업이긴 하지만 로딩시간이 장난이 아닌데,
그게 다 이런 유용한 기능을 위해서 투입한 리소스라고 생각하면 아깝지가 않네요.
2. text
문자열은 뭐.. "Click me!" 정도로 해보면 될 것 같고요. 넘어갈게요.
3. parent...
부모님이 누구시니?
웹개발 해본 분들은 부모에 자식에 형제자매개념을 잘 아실 것 같아요. 처음에 이 단어를 접했을 때 감은 오지만 왤케 어색하던지.. 하여튼 이 버튼객체를 담을 상위 객체를 가리키는 거죠.
QWidget을 미리 하나 생성해놓고, 거기다가 담아보죠, 뭐. 간단하죠?
우리가 원하는 결과물은,
"QWidget창 안에 QPushButton 객체가 들어있고, 버튼 안에 아이콘과 텍스트가 생성된 상태"였어요.
한 번 실행해볼까요? (실행 전에 window.show() 잊지 마세요^^)
끝.
이번 튜토리얼을 마무리하며
단일 위젯을 가지고 작업하는 건 이런 방식으로 진행하시면 수월하실 거라고 생각해요.
그래서 이 이하로는, 특별히 중요한 설명이 아니면 위젯 하나하나의 기능을 설명드리는 건 줄이려고 해요.
저도 PyQt 영상강의나 교재를 볼 때 위젯설명은 다 지루해서 건너뛰었거든요.
(제가 언제 다이얼을 쓸 일이 있겠어요?;;)
대신 이제부터는 QMainWindow나 레이아웃 관련한 모듈을 먼저 설명드리려고 해요.
QWidget 안에서 이런 구조 저런 구조 만들고 위젯 다 때려넣으면 원하는 모양이 나올 가능성도 있긴 하죠. 근데 QMainWindow는 굉장히 잘 짜여진 뼈대가 만들어져(숨겨져) 있어서, 여러분이 원하기만 하면 각종위젯 외에도 툴바, 상단메뉴, 하단상태표시줄, 도킹 가능한 위젯아이콘 등 다양한 기능을 쉽게 구현할 수 있어요. 당연히 구현 안 하셔도 괜찮고요.
웹을 배워본, 특히 파이썬 웹프레임워크를 써보신 분들은 공감하실 것 같은데,
저는 QMainWindow는 Django 같고, QWidget은 Flask 같아요.
QML이나 QSS, MVC개념에 DBMS를 붙이는 걸 보면, Qt는 웹개발이랑 너무 닮았다는 생각도 들고요.
그리고 어느 정도 손으로 구조를 짜는 게 익숙해지는 시점에(그래봤자 서너개 정도?) 시그널-슬롯이나 액션, 이벤트 같은 개념에 대해 랜덤하게 알려드릴 예정이예요. 난이도 순서로 진행하면 초반엔 너무 쉬워서 지루하고, 나중엔 너무 어려워서 지치시는 것 같더라고요.
초반 급발진으로 시그널-슬롯도 알려드리고, 깜빡이 안 넣고 동시성도 한 번 설명해드리고.. 이래야 과정이 더 흥미진진해지겠다는 생각이 드네요. 그렇다고 장난치듯 진행하진 않을테니까 걱정말아주세유.
하여튼 다음 튜토리얼부터는 QMainWindow 위젯을 주로 연습해볼 거예요. 실용적이고 다양한 예를 많이 들어드리고 싶은데, 저도 늘 쓰던 것만 쓰던 처지라, 경험이 굉장히 제한적이거든요. 그래서 오픈된 다른 분들의 예제를 많이 인용해서, 제가 쉽게 이해 및 암기하려고 했던 비유나, 파이참 팁을 섞어서 제 스타일로 소화해 보고 싶네요.
언제든 질문이나 제안, 또는 틀린 부분이 있으면 댓글 남겨주시면 감사하겠습니다.
그럼 다음 포스팅에서 뵈어요!
행복한 하루 되세요^^
'GUI 튜토리얼 > PySide6 # Qt의 원조가 돌아왔다!' 카테고리의 다른 글
1. PySide6의 QMainWindow에 대해 알아봅시다. (0) | 2021.03.24 |
---|---|
[4/?] Qt에서의 이벤트루프란 무엇인가? (0) | 2021.03.19 |
[3/?] PySide6에서 가장 기초가 되는 QApplication과 QWidget (8) | 2021.03.19 |
댓글