본문 바로가기
프로그래밍/Python

Pyside6 ] 개발 환경 설정 with VSCode

by eteo 2024. 6. 8.
반응형

 

 

 

pyside6 설치

 

pip install pyside6

 

 

 

 

 

 

 

VScode에서 Qt for Python 익스텐션 설치

 

 

 

 

 

 

 

 

test.py를 만들고 공식문서에서 제공한 코드를 복붙한 후 콘솔에서 python test.py로 실행한다.

 

https://doc.qt.io/qtforpython-6/tutorials/basictutorial/widgets.html

import sys
from PySide6.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
label = QLabel("Hello World!")
label.show()
app.exec()

 

 

 

 

다음은 애플리케이션에 Label 하나만 추가한 예제이며, 한줄 씩 그 내용을 살펴보면 다음과 같다.

# command line arguments에 접근하기 위해 필요하다.
import sys

# PySide6 클래스 QtWidgets 모듈에서 QApplication과 QLabel을 import 한다.
from PySide6.QtWidgets import QApplication, QLabel

# QApplication 인스턴스를 만들고 명령줄 인수인 sys.argv를 넘긴다.
app = QApplication(sys.argv)

# QLabel 인스턴스를 만드로 라벨의 텍스트를 "Hello World!"로 셋한다.
label = QLabel("Hello World!")

# label을 visible하도록 한다.
label.show()

# event loop를 실행한다.
app.exec()

 

 

 

 

app.exec()으로 이벤트 루프가 시작되는데 이벤트 루프란?

 

https://www.pythonguis.com/tutorials/pyside6-creating-your-first-window/

 

 

PyQt6 또는 PySide6 기반 GUI 애플리케이션에서는 app.exec() 호출 시 메인스레드 상에서 하나의 이벤트 루프가 시작되며, 이 이벤트 루프는 사용자 입력(키보드, 마우스 등)과 시스템 이벤트를 큐에 저장하고, 이를 순차적으로 처리하여 UI를 갱신하고 동작을 제어하는 역할을 수행한다.

이벤트 루프가 원활하게 동작하기 위해서는 메인스레드가 항상 비워져 있어야 하며, 파일 I/O, 대규모 연산과 같은 무거운 작업을 메인스레드에서 직접 실행할 경우 이벤트 루프가 블로킹되어 UI 갱신이 중단되고 프로그램이 '응답 없음' 상태로 진입할 수 있다. 따라서 무거운 작업은 별도의 스레드(QThread 등)로 분리하여 실행하고, 메인스레드는 사용자 이벤트 처리와 화면 렌더링에만 집중하도록 해야 한다.

 

 

 

 

 

한편, 보통 PyQt 또는 Pyside에서 GUI 애플리케이션의 기본 창을 만들 때는 QMainWindow를 만들고 시작한다. 아래는 QMainWindow의 구조를 시각화한 것이다.

 

 

  • QMainWindow : PySide에서 메인 애플리케이션 창을 만들 때 가장 기본이 되는 클래스
    • Menu Bar (맨 위) : File, Edit, Help 같은 메뉴 항목이 들어가는 부분
    • Toolbars (Menu 아래) : 아이콘 버튼(예: 새로고침)이 들어가는 툴바 영역
    • Dock Widgets (Toolbars 밑, 주변을 감싸는 부분) : 서브 창처럼 붙였다 뗐다 할 수 있는 창들 (예: 탐색기, 설정 패널)
    • Central Widget (Dock 안의 중앙 부분) : 프로그램의 핵심 컨텐츠가 표시되는 가장 중요한 영역. Central Widget 안에는 원하는 위젯을 추가하기 전에 먼저 레이아웃을 잡아주는 것이 일반적이다. 보통 QVBoxLayout과 QHBoxLayout을 조합하여 복잡한 레이아웃 구성을 먼저 설정한 다음, 그 레이아웃 안에 버튼, 테이블, 폼, 그래프 같은 실제 위젯들을 추가해나가는 방이다.
      • QVBoxLayout : 위에서 아래로 수직으로 위젯을 쌓아가는 레이아웃
      • QHBoxLayout : 왼쪽에서 오른쪽으로 수평으로 위젯을 나열하는 레이아웃
      • QGridLayout : 격자(Grid)처럼 행(row), 열(column) 단위로 위젯을 배치하는 레이아웃
      • QFormLayout : 왼쪽은 라벨(Label), 오른쪽은 입력창(LineEdit, ComboBox 등)으로 구성된 입력폼을 만들 때 최적화된 레이아웃
    • Status Bar (맨 아래) : 사용자에게 현재 상태나 메세지를 보여주는 영역

 

 

 

 

 

 

다음 QtDesigner를 사용해 앱을 만들어보자.

 

VSCode 작업영역에서 마우스 우클릭해 Create Qt UI File을 클릭해 ui_test.ui 파일을 생성해준다. 혹은 명령줄에서 designer라고 치면 된다.

 

 

 

 

 

Qt Designer가 뜨면 Main Window를 하나 생성한다.

 

 

 

다음과 같이 간단한 위젯을 만들어 배치하고 위젯 객체의 이름을 식별하기 쉽게 변경해줬다.

 

 

 

 

Qt Designer 파일을 저장하고 나오면 아까 GUI로 편집한 내용이 다음과 같이 QML로 써있다.

 

 

 

 

그리고 아까 설치한 Qt for Python 익스텐션을 통해 .ui파일 저장과 동시에 pyside6-uic.exe를 통해서 .ui파일을 .py파일로 변환해 생성해준다.

 

 

 

pyside6-uic.exe -o 옵션으로 생성할 .py 파일명도 익스텐션 세팅에 들어가 변경할 수 있다.

 

 

 

 

test.py를 다음과 같이 수정해 QtDesigner로 생성한 파일과 연결한다.

 

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
# ui_test.py에서 Ui MainWindow를 import한다.
from ui_test import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        # setupUi 함수를 호출해 MainWindow에 있는 위젯을 배치한다.
        self.ui.setupUi(self)
        
        # button clicked 이벤트 핸들러로 button_clicked 함수와 연결한다.		
        self.ui.button.clicked.connect(self.button_clicked)
    
    def button_clicked(self):
    	# input 위젯의 텍스트를 output 위젯에 셋한다.
        inputText = self.ui.input.text()
        self.ui.output.setText('{0}'.format(inputText))

if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec())

 

 

 

 

 

 

📍 가상환경에서 작업 시

1. 가상환경 생성
python -m venv .venv
2. 가상환경 활성화
.venv\Scripts\activate  # Windows
3. 가상환경에서 작업
(myenv) ~
4. 가상환경 비활성화
deactivate.bat
반응형