PyQt개발강좌, QWidget 상속을 통한 커스텀 위젯 만들기

PyQt는 Python에서 GUI 애플리케이션을 개발하기 위한 강력한 라이브러리입니다. PyQt를 사용하면 다양한 기본 제공 위젯을 활용할 수 있지만, 때때로 특정 용도에 맞는 커스텀 위젯이 필요할 수도 있습니다. 본 강좌에서는 QWidget 클래스를 상속하여 어떻게 나만의 커스텀 위젯을 만들 수 있는지에 대해 자세히 설명하겠습니다. 예제를 통해 단계별로 진행하며, 최종적으로 완전한 프로그램을 만들 것입니다.

1. PyQt 환경 설정

PyQt5를 설치하려면 아래의 pip 명령어를 사용하세요.

pip install PyQt5

2. QWidget 클래스 이해하기

QWidget는 PyQt의 모든 사용자 인터페이스 요소의 기본 클래스입니다. QWidget 클래스를 상속하여 우리는 자신의 사용자 정의 위젯을 만들 수 있습니다. QWidget 클래스는 기본적으로 GUI 요소, 레이아웃, 이벤트 처리 등의 여러 기능을 제공합니다.

3. 커스텀 위젯 만들기

이제 QWidget을 상속하여 간단한 커스텀 위젯을 만들어 보겠습니다. 이 예제에서 우리는 사용자로부터 입력을 받고, 버튼을 클릭했을 때 해당 입력을 반영하여 텍스트를 표시하는 간단한 위젯을 만들 것입니다.

3.1. 예제 코드 설명

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout

class CustomWidget(QWidget):
    def __init__(self):
        super().__init__()

        # 레이아웃 설정
        self.layout = QVBoxLayout()
        
        # QLabel 초기화
        self.label = QLabel("여기에 텍스트를 입력하세요:", self)
        
        # QLineEdit 초기화
        self.line_edit = QLineEdit(self)
        
        # QPushButton 초기화
        self.button = QPushButton("제출", self)
        self.button.clicked.connect(self.on_click)

        # 레이아웃에 위젯 추가
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.line_edit)
        self.layout.addWidget(self.button)
        
        self.setLayout(self.layout)
        self.setWindowTitle("커스텀 위젯 예제")
    
    def on_click(self):
        # QLabel의 텍스트를 QLineEdit의 입력값으로 변경
        input_text = self.line_edit.text()
        self.label.setText("입력한 텍스트: " + input_text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    custom_widget = CustomWidget()
    custom_widget.show()
    sys.exit(app.exec_())

3.2. 코드 해설

위의 예제 코드는 다음과 같은 구성 요소로 이루어져 있습니다:

  • CustomWidget 클래스: QWidget을 상속받아 커스텀 GUI 위젯을 정의합니다.
  • 레이아웃 설정: QVBoxLayout을 사용하여 위젯을 수직으로 배치합니다.
  • QLabel: 사용자가 텍스트를 입력하도록 지시하기 위한 라벨입니다.
  • QLineEdit: 사용자가 텍스트를 입력할 수 있는 필드입니다.
  • QPushButton: 사용자가 입력한 텍스트를 제출할 수 있는 버튼입니다.
  • on_click 메소드: 버튼 클릭 시 실행되어, QLineEdit의 텍스트를 QLabel에 반영합니다.

4. 이벤트 처리

PyQt에서 이벤트 처리는 매우 중요합니다. 위 예제에서 버튼 클릭 이벤트는 clicked 시그널을 통해 처리되며, on_click 메소드를 호출합니다. 사용자 정의 위젯에 별도의 이벤트 처리가 필요한 경우, 다수의 이벤트 핸들러를 추가하여 다양한 상호작용을 구현할 수 있습니다.

4.1. 키보드 이벤트 처리

이벤트를 추가로 처리하는 방법에 대해 알아보겠습니다. 예를 들어, QLineEdit에 입력한 후 Enter 키를 누르면 QLabel의 텍스트가 변경되도록 하겠습니다.


def keyPressEvent(self, event):
    if event.key() == Qt.Key_Return:
        self.on_click()

위 코드를 CustomWidget 클래스 안에 추가하면, 사용자가 Enter 키를 눌렀을 때 on_click 메소드가 호출됩니다.

5. 커스텀 위젯에 스타일 적용하기

커스텀 위젯에 스타일을 적용하여 더욱 매력적인 인터페이스를 만들 수 있습니다. 위젯에 다양한 CSS 스타일을 적용할 수 있습니다. 예를 들어, 버튼에 배경 색상을 추가해 보겠습니다.


self.button.setStyleSheet("background-color: lightblue; color: black; font-size: 16px;")

6. 다양한 위젯 조합하기

여러 가지 커스텀 위젯을 조합하여 복잡한 사용자 인터페이스를 만들 수 있습니다. 이런 조합은 복잡한 애플리케이션을 설계할 때 필요합니다. 각각의 위젯을 모듈화하여 필요한 위치에 쌓거나 배치할 수 있습니다.

7. 결론

이번 강좌에서는 PyQt를 사용하여 QWidget을 상속받아 커스텀 위젯을 만드는 방법에 대해 배웠습니다. 간단한 예제를 통해 속성과 메소드, 이벤트 처리 및 스타일링 방법을 익혔습니다. 이러한 기본기를 바탕으로 더 복잡한 애플리케이션을 만들 수 있을 것입니다. PyQt는 매우 유연한 라이브러리이므로, 다양한 가능성을 탐구하며 재미있게 사용할 수 있습니다.

8. 추가 자료

PyQt에 대한 더 많은 자료와 리소스를 찾고자 한다면, 다음의 링크를 참고하시기 바랍니다:

9. Q&A

궁금한 점이나 피드백이 있다면 아래 댓글란에 남겨 주세요. 도움이 필요한 경우 답변해 드리도록 하겠습니다!

이 글은 PyQt에 대한 이해를 돕기 위한 목적으로 작성되었습니다. 많은 도움이 되셨기를 바랍니다!