PyQt개발강좌, PyQt 프로젝트 구조 및 주요 파일 설명

PyQt는 Python의 강력한 GUI 툴킷으로, Qt 프레임워크를 기반으로 하고 있습니다. PyQt를 사용하면 데스크탑 애플리케이션을 쉽고 빠르게 개발할 수 있습니다. 본 강좌에서는 PyQt 프로젝트의 구조와 주요 파일에 대해 자세히 설명하겠습니다. 이 글은 PyQt의 기본 개념을 알고 있는 개발자를 대상으로 하며, 와 함께 예제 코드를 통해 실제 프로젝트에서 어떻게 구조를 잡아야 하는지 알아보겠습니다.

1. PyQt의 기본 개념

PyQt는 Qt 어플리케이션을 파이썬에서 사용할 수 있도록 해주는 바인딩입니다. Qt는 C++로 작성된 GUI 프레임워크로, 크로스 플랫폼 애플리케이션 개발을 지원합니다. PyQt는 다양한 위젯과 툴을 제공하여 데스크탑 애플리케이션을 만들 수 있으므로, 사용자는 인터페이스를 쉽게 개발할 수 있습니다.

1.1 PyQt5 vs PyQt6

현재 PyQt5와 PyQt6 버전이 있습니다. PyQt5는 Qt5를 기반으로 한 반면, PyQt6는 Qt6을 기반으로 하고 있습니다. 새로운 프로젝트를 시작하는 경우 PyQt6을 사용하는 것을 권장하지만, 기존 프로젝트는 PyQt5로 유지할 수 있습니다.

2. PyQt 프로젝트 구조

PyQt 프로젝트는 여러 파일과 디렉토리로 구성됩니다. 일반적인 PyQt 프로젝트 구조는 아래와 같습니다.

my_pyqt_project/
├── main.py
├── ui/
│   ├── main_window.ui
│   └── ...
├── resources/
│   ├── images/
│   └── ...
├── styles/
│   └── main_style.qss
└── libs/
    └── utility.py

2.1 주요 파일 및 디렉토리 설명

  • main.py: 프로젝트의 진입점입니다. 이 파일은 애플리케이션 인스턴스를 생성하고 기본 창을 보여주는 역할을 합니다.
  • ui/: Qt Designer로 디자인한 UI 파일을 저장하는 디렉토리입니다. 보통 .ui 확장자를 갖고 있습니다.
  • resources/: 이미지, 아이콘, 폰트 등의 리소스를 저장하는 디렉토리입니다.
  • styles/: 애플리케이션의 스타일을 정의하는 .qss 파일을 저장하는 곳입니다. Qt 스타일 시트를 사용해 UI를 꾸밀 수 있습니다.
  • libs/: 재사용 가능한 모듈이나 유틸리티 파일을 저장하는 디렉토리입니다.

3. PyQt 프로젝트 예제

이제 간단한 PyQt 프로젝트를 생성해 보겠습니다. 이 프로젝트는 기본적인 GUI를 포함하며, 버튼 클릭 시 메시지 박스가 나타나는 기능을 갖고 있습니다.

3.1 main.py

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt Example")
        self.setGeometry(300, 300, 400, 200)
        
        self.button = QPushButton("Click Me", self)
        self.button.setGeometry(150, 80, 100, 30)
        self.button.clicked.connect(self.show_message)

    def show_message(self):
        QMessageBox.information(self, "Message", "Button Clicked!", QMessageBox.Ok)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

3.2 UI 디자인

위 링크의 예제 코드는 프로그램의 UI를 코드로 정의한 것입니다. 보다 복잡한 UI를 원한다면, Qt Designer를 사용할 수 있습니다. Qt Designer를 사용하면 Drag-and-Drop 방식으로 위젯을 추가하고, 유저 인터페이스를 디자인할 수 있습니다.

Qt Designer에서 UI 파일 생성하기

  • Qt Designer를 엽니다.
  • 새로운 Form을 생성하고, 원하는 위젯들을 추가합니다.
  • 파일 메뉴에서 “다른 이름으로 저장”을 선택하고, main_window.ui로 저장합니다.

4. UI 파일을 파이썬 코드로 변환하기

생성한 main_window.ui 파일을 파이썬 코드로 변환해야 합니다. pyuic5 명령어를 사용하여 UI 파일을 변환할 수 있습니다. 아래와 같은 명령어를 터미널에 입력합니다.

pyuic5 -x ui/main_window.ui -o ui/main_window.py

이제, 생성된 main_window.py 파일을 가져와 main.py에서 사용해 보겠습니다.

from ui.main_window import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.button.clicked.connect(self.show_message)

5. 애플리케이션의 스타일 설정

애플리케이션의 스타일을 설정하기 위해 QSS 파일을 사용할 수 있습니다. 아래는 기본 스타일을 설정하는 main_style.qss 파일의 예입니다.

QMainWindow {
    background-color: #f0f0f0;
}
QPushButton {
    background-color: #4CAF50;
    color: white;
}
QPushButton:hover {
    background-color: #45a049;
}

5.1 스타일 적용하기

스타일을 적용하려면 main.py 파일에서 QSS 파일을 로드해야 합니다. 아래 코드를 추가합니다.

def load_css(self):
    with open("styles/main_style.qss", "r") as f:
        self.setStyleSheet(f.read())

위의 함수를 생성자에 호출하면 스타일이 적용됩니다.

6. 에러 처리 및 로깅

프로젝트의 안정성을 높이기 위해 에러 처리는 필수적입니다. 예를 들어, 버튼 클릭 이벤트에서 에러가 발생할 가능성이 있다면, try-except 문을 사용하여 에러를 처리할 수 있습니다.

def show_message(self):
    try:
        # 비즈니스 로직
        QMessageBox.information(self, "Message", "Button Clicked!", QMessageBox.Ok)
    except Exception as e:
        QMessageBox.critical(self, "Error", str(e), QMessageBox.Ok)

7. 마무리

이번 글에서는 PyQt 프로젝트의 구조와 주요 파일에 대해 알아보았습니다. 또한 기본적인 예제를 통해 PyQt를 사용하여 애플리케이션을 만드는 과정을 설명했습니다. PyQt를 활용하면 사용자 인터페이스를 쉽고 빠르게 개발할 수 있으며, 다양한 기능과 스타일을 적용할 수 있습니다. 앞으로 더 복잡한 애플리케이션을 만들어보며 PyQt의 매력을 느껴보시기 바랍니다.

감사합니다!