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

1. QMainWindow를 소개드리기 전에, QPushButton만 더 설명드리고...

by 일코 2021. 3. 20.

QMainWindow를 소개드리기 전에

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

최근 튜토리얼에서는 PySide6(Qt)로 창을 생성하는 최소한의 코드를 보여드렸습니다.

 

 

1. PySide6에서 가장 기초가 되는 QApplication과 QWidget

PySide6에서 가장 기초가 되는 두 가지 클래스, QApplication과 QWidget 안녕하세요? 회사원코딩입니다. 이번 포스팅에서 설명드릴 코드는 가장 단순한 창만들기입니다. 임포트문을 제외하면 네 줄밖에

www.martinii.fun

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입니다.)

QWidget만 QPushButton으로 바꿔보았습니다.

이대로 실행하면 어떤 모양의 창이 나올까요?

정상적으로 실행됩니다.

하여튼 실행에는 문제가 없네요. 사이즈나 버튼의 텍스트가 없는 점이 약간 어색하긴 하지만요.

그럼 이 시점에서 한 개의 위젯을 가지고 GUI창을 만드는 건 여러분 거의 마스터하신 거예요.

위젯별로 필요한 옵션은 문서를 참고하셔도 되고요.

파이참으로는, 메서드 부분에 캐럿을 놓고 Ctrl-q를 눌러 Quick Documentation을 읽으시거나, 

간단히 괄호 안에 캐럿을 두고 Ctrl-p를 눌러 파라미터 옵션을 보셔도 돼요.

QPushButton에 대한 설명입니다. 상단에 icon, text, parent에 대한 정보가 나와 있죠.

 

파라미터 정보(Ctrl-p)만 봐도 원하는 정보를 얼추 얻을 수 있습니다.

(삼천포로 빠지는 느낌이지만) 위의 정보를 참고해보면 QPushButton에 들어갈 수 있는 인자가 세 가지 있는데,

icon(QIcon객체), text:(문자열), parent:(QWidget 등)

이라는 정보를 알 수 있었네요. 이걸 다 집어넣는 것도 절대 복잡한 작업이 아니어서 한 번 보여드리겠습니다.

(따라하지 않으셔도 돼요.)

 

1. icon(QIcon객체)

icon 인자에 들어갈 파라미터로는 QIcon이 나와야 한다고 하는데, IDE를 안 써보신 분들은 문서 하나하나 읽으면서 모듈 경로를 고생해서 찾으시는데, 다행히 여러분은 파이참을 쓰고 계시니까, 간편한 방법을 알려드릴게요. 우선 임포트를 했다고 생각하고 코드를 완성해버리는 거예요. 그리고 나서 마법의 자동완성기능Alt-Enter를 쓰는 거죠.

먼저 이렇게 작성을 해놓고,
빨간줄 위에서 Alt-Enter로 임포트문까지 자동완성

파이참으로 처음 프로젝트 만들 때 모든 모듈을 인덱싱하는 데 시간이 많이 걸리죠.
특히 아나콘다 까셨으면 백그라운드작업이긴 하지만 로딩시간이 장난이 아닌데,
그게 다 이런 유용한 기능을 위해서 투입한 리소스라고 생각하면 아깝지가 않네요.

2. text

문자열은 뭐.. "Click me!" 정도로 해보면 될 것 같고요. 넘어갈게요.

3. parent...

부모님이 누구시니?

웹개발 해본 분들은 부모에 자식에 형제자매개념을 잘 아실 것 같아요. 처음에 이 단어를 접했을 때 감은 오지만 왤케 어색하던지.. 하여튼 이 버튼객체를 담을 상위 객체를 가리키는 거죠.

QWidget을 미리 하나 생성해놓고, 거기다가 담아보죠, 뭐. 간단하죠?

parent까지 설정을 마쳤습니다.

우리가 원하는 결과물은,

"QWidget창 안에 QPushButton 객체가 들어있고, 버튼 안에 아이콘과 텍스트가 생성된 상태"였어요.

한 번 실행해볼까요? (실행 전에 window.show() 잊지 마세요^^)

아직 뭔가 좀 허접해 보이지만 원하는 건 다 실행됐네요.

끝.

이번 튜토리얼을 마무리하며

단일 위젯을 가지고 작업하는 건 이런 방식으로 진행하시면 수월하실 거라고 생각해요.

그래서 이 이하로는, 특별히 중요한 설명이 아니면 위젯 하나하나의 기능을 설명드리는 건 줄이려고 해요.

저도 PyQt 영상강의나 교재를 볼 때 위젯설명은 다 지루해서 건너뛰었거든요.

(제가 언제 다이얼을 쓸 일이 있겠어요?;;)

대신 이제부터는 QMainWindow레이아웃 관련한 모듈을 먼저 설명드리려고 해요.

QWidget 안에서 이런 구조 저런 구조 만들고 위젯 다 때려넣으면 원하는 모양이 나올 가능성도 있긴 하죠. 근데 QMainWindow는 굉장히 잘 짜여진 뼈대가 만들어져(숨겨져) 있어서, 여러분이 원하기만 하면 각종위젯 외에도 툴바, 상단메뉴, 하단상태표시줄, 도킹 가능한 위젯아이콘 등 다양한 기능을 쉽게 구현할 수 있어요. 당연히 구현 안 하셔도 괜찮고요.

웹을 배워본, 특히 파이썬 웹프레임워크를 써보신 분들은 공감하실 것 같은데,
저는 QMainWindow는 Django 같고, QWidget은 Flask 같아요.
QML이나 QSS, MVC개념에 DBMS를 붙이는 걸 보면, Qt는 웹개발이랑 너무 닮았다는 생각도 들고요.

그리고 어느 정도 손으로 구조를 짜는 게 익숙해지는 시점에(그래봤자 서너개 정도?) 시그널-슬롯이나 액션, 이벤트 같은 개념에 대해 랜덤하게 알려드릴 예정이예요. 난이도 순서로 진행하면 초반엔 너무 쉬워서 지루하고, 나중엔 너무 어려워서 지치시는 것 같더라고요.

초반 급발진으로 시그널-슬롯도 알려드리고, 깜빡이 안 넣고 동시성도 한 번 설명해드리고.. 이래야 과정이 더 흥미진진해지겠다는 생각이 드네요. 그렇다고 장난치듯 진행하진 않을테니까 걱정말아주세유.

 

하여튼 다음 튜토리얼부터는 QMainWindow 위젯을 주로 연습해볼 거예요. 실용적이고 다양한 예를 많이 들어드리고 싶은데, 저도 늘 쓰던 것만 쓰던 처지라, 경험이 굉장히 제한적이거든요. 그래서 오픈된 다른 분들의 예제를 많이 인용해서, 제가 쉽게 이해 및 암기하려고 했던 비유나, 파이참 팁을 섞어서 제 스타일로 소화해 보고 싶네요.

언제든 질문이나 제안, 또는 틀린 부분이 있으면 댓글 남겨주시면 감사하겠습니다.

 

그럼 다음 포스팅에서 뵈어요!

행복한 하루 되세요^^

 

 


donaricano-btn

댓글