본문 바로가기
카테고리 없음

신입 혼자서 공부하는 PyQt - 가장 헷갈렸던 코드 3줄

by 개복치96 2025. 5. 13.
반응형

https://doc.qt.io/qtforpython-6/

 

Qt for Python

Packages, installation, and details.

doc.qt.io


오늘은 또 PyQt과 PyQt Designer에 대해서 배웠다.
사실 배웠다고 해야할지 모르겠다.
아니지 배운건 맞다.
다만 회사에서 뭔갈 배우진 않았다. GPT에게 배웠지

해야할게 너무 많아서 죽어버릴꺼 같은 요즘이다.

사실 취업을 하고 나서는 솔직히 조금 덜 힘들꺼라 생각했다.
근데 더 힘들다. 그동안은 이런 생각을 부정했다.

그래도 취업은 했으니까, 그래도 돈은 버니까.
요즘 취업시장이 얼마나 힘든데.
이 정도면 괜찮아.

아니다. 안괜찮다.
죽을꺼 같다.

분명 나는 JAVA 중심으로 공부했고, 나름 좋은 성과도 얻었고,
Unity, C#, 인프라, 하드웨어, AI 등 깊진 않지만 맛은 본 경험도 다양하다.

그런데 들어와서는 귀신 같이 이것들을 전부 다 뺀 나머지만 하고 있다.

C를 사용하는 RTOS인 VxWorks로 개발하며 커널까지 이해해야하고,
Python과 PyQt와 RS-232통신, 그리고 암복호화를 포함한 시뮬레이터를 만들어야하며,
LLM과 MLOps를 학습해서 프로젝트를 진행해야한다.
아, 맞다. 논문도 개재해야한다. 살면서 한번도 써본 적은 없지만...
그리고 SW 교육 출장가면 C++로 교육받고 프로젝트를 진행해야한다.

이 외에 업무는 당연히 있고... 신입이라 눈치보는 것도 물론 있고.
주말에도 출근하고 한달에 200시간 조금 넘게 일하는 것 같다 평균적으로.

솔직히 농담으로라도 행복하다는 말이 안나온다. 점점 악에 받치는 느낌이다.
다른 것이라면 예전에는 악으로 깡으로 어떻게든 했는데, 이제는 그냥 놓고 싶을 뿐이다.
마음속에 끈이 점점 닳고 있는 것 같다.

가장 힘들고 화가 나고 속상한건, 이렇게 힘들게 살아도 이게 내 능력에 도움이 되지 않을지 모른다는 생각이 자꾸 들어서 그렇다. 내 능력과 내 커리어에 도움도, 이직에 도움도 안되는... 그런 상황. 이게 가장 고통스럽다.

그래서 뭐라도 안하면 진짜 다 놓을 것 같아서, 마지막의 마지막 힘을 짜내서 블로그에 한줄이라도 남겨보려한다.
고통의 기록이지만, 여느 노래 가사처럼 나중에 추억할 수 있길 바라며, 한자 한자 눌러가며 적어본다.

내가 한 모든 것들이 그저 고생만은 아니길, 내가 보낸 시간들이 허송세월이 아니길...


자, 시작한다.

PyQt라는것 자체를 처음 들어보았다. 처음에는 무슨 말인지도 몰랐다.

Python으로 시뮬레이터를 개발하며 GPT에게 물어가며 해보는 도중에 PyQt로 Ui를 짜라고 해서
대충 들은 발음과 Ui 개발 방법을 GPT에 물어서 알게 되었다.
(참, 회사는 폐쇄망이라 설치하는 방법도 모르고 아무도 알려주지 않지만 어떻게 혼자 하기는 했다...
인생... 요즘 뼈에 사무치게 와닿는 말이 '각자도생'이다.)

PyQt가 무엇인지, 기본 개념 등등은 다른 블로그에도 많을 것이고,
나는 내가 모르고 답답했던 부분을 중점으로 기술하려한다.

Qt Designer를 사용해서 Ui를 짜고 Python 코드로 변환하면 아래와 같은 코드들이 눈에 들어온다.

Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)

이 세 줄은 Qt Designer로 만는 .ui 파일을 코드로 사용하는 공식 패턴이다.
비유하다면 Qt Designer로 만든건 Gui로 내가 그린 "도면"이고,
Form = QtWidgets.QWidget()은 "진짜 빈 집"이고,
ui.setupUi(Form)은 "도면대로 이 집에 창문과 문, 가구를 배치하는 작업"이다.

1. Form = QtWidgets.QWidget()

무슨 뜻인가?

➡️ PyQt에서 창 하나를 만드는 코드이다.

  • QWidget은 PyQt의 기본 창 위젯이다.
  • QMainWindow, QDialog, QFrame 등도 이를 기반으로 생성된다.
    ➡️ Form은 지금 화면에 띄울 대상 창을 의미한다.

2. ui = Ui_Form()

무슨 뜻인가?

-> Qt Designer로 만든 .ui파일을 pyuic5로 변환하면 나오게 되는 클래스이다.

  • Ui_Form 은 "디자이너에서 만든 모든 위젯 정의"를 담고 있는 클래스이다.
  • 이 안에는 setupUi()라는 함수가 들어있다.
    ➡️ 즉, ui는 디자이너에서 만든 설계도를 메모리에 불러온 것과 같다.

3. ui.setupUi(Form)

무슨 뜻인가?

➡️ 이제 도면대로 건물을 세우는 작업이다.

  • setupUi()는 내부적으로 Form이라는 빈 QWidget에다가 버튼, 레이블, 테이블 등등을 디자이너에서 배치한 그대로 배치하는 함수이다.
  • Form이 빈 집이었다면 이 코드 줄을 통해 집을 완성하게 된다.

4. 요약

  • QWidget() => 빈 집 하나 짓기
  • 'Ui_Form()` => 설계 도면 가져오기
  • `setupUi(Form) => 도면대로 집 안에 구조물 넣기

지금까지는 코드를 비유적으로 분석해봤다.

그러면 이번에는 실제로 메모리 안에서 어떤 일이 일어나는지 보자.

Form = QtWidgets.QWidget()

➡️ Form 객체 생성됨. 아직 아무것도 없음.

ui = Ui_Form()

➡️ setupUi() 함수 준비됨

ui.setupUi(Form)

➡️ Form 내부에 버튼, 테이블 등 위젯이 생성되고 배치됨
➡️ Form.setLayout(...), self.pushButton = QWidgets.QPushButton(...) 이런 코드들 이 실행됨


여기서 예를 들어 버튼 클릭 이벤트를 연결할 수 있다.

ui.pushBu➡️ 빈 집 짓기
`ㅕㅑtton.clicked.connect(my_function)

➡️ setupUi() 덕분에 ui.pushButton이 메모리에 존재하는 것.
➡️ 그래서 코드에 직접 접근이 가능한 것


결론

Form = QWidgets.QWidget() ➡️ 창(빈 폼) 만들기 ➡️ 빈 집 짓기
ui = Ui_Form() ➡️ UI 설계도 준비 ➡️ 설계도 꺼내기
`ui.setupUi(Form) ➡️ 설계도대로 창에 위젯 배치 ➡️ 가구 넣고 집 완성


즉, 지금까지 설명한 이 패턴은 Designer 기반 UI를 PyQt에서 사용하는 표준이라고 할 수 있다.


다음 게시물에서는 이를 조금 더 개발자스럽게 설명해보도록 하겠다.

반응형