PyQt6를 사용하면 다양한 위젯을 만들 수 있지만 때로는 기본 제공 위젯만으로는 원하는 기능을 구현하기 어려운 경우가 있습니다. 이런 경우 PyQt6 QT Designer 사용자 지정 위젯 만들기가 가능합니다. 몇가지 예시와 내용을 통해 같이 알아 보겠습니다.
[목차]
1. PyQt6 사용자 지정 위젯 만들기
PyQt6에서 사용자 지정 위젯을 만드는 것은 꽤 간단합니다. 우선 PyQt6.QtWidgets.QWidget 클래스를 상속하는 새 클래스를 만듭니다. 그런 다음 새 클래스에서 사용할 모든 위젯, 레이아웃 및 다른 구성 요소를 정의합니다.
예를 들어, 새 클래스에서 QPushButton과 QLabel 위젯을 사용하려면 새 클래스에서 이러한 위젯을 만들고 배치해야합니다. 이러한 구성 요소는 원하는 기능에 따라 다양하게 조합할 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | from PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, QLabel class CustomWidget(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): layout = QVBoxLayout() button = QPushButton(“Click me”) label = QLabel(“Hello, World!”) layout.addWidget(button) layout.addWidget(label) self.setLayout(layout) if __name__ == ‘__main__’: app = QApplication([]) widget = CustomWidget() widget.show() app.exec() | cs |
2. Qt Designer 사용한 위젯 만들기
사용자 지정 위젯을 만드는 또 다른 방법은 Qt Designer를 사용하는 것입니다. Qt Designer는 PyQt6에서 GUI를 디자인하고 코드를 생성하는 데 사용되는 시각적인 도구입니다. 디자인을 마친 후 코드를 생성하면 사용자 지정 위젯을 쉽게 만들 수 있습니다. 쉽게 말하자면 파이썬 코드로 ui를 변환하여 불러오는 방법 중 하나 입니다.
ui를 유지한 상태로 파이썬에 불러오길 원한다면 아래 링크 글을 참고해주세요
[Qt Designer 사용자 정의 위젯 설계]
- Qt Designer를 시작하고 새 양식을 만듭니다.
- 원하는 위젯(예: QPushButton 및 QLabel)을 양식으로 끌어다 놓습니다.
- 필요에 따라 위젯의 속성, 레이아웃 및 디자인을 사용자 지정합니다.
- 양식을 “custom_widget.ui”로 저장합니다.


[Qt Designer 형식에서 Python 코드 생성]
- 터미널 또는 명령 프롬프트를 열고 “custom_widget.ui”가 저장된 디렉토리로 이동합니다.
- 명령을 사용하여
pyuic6
.ui 파일에서 Python 코드를 생성합니다.
1 2 | pyuic6 –x custom_widget.ui –o custom_widget_ui.py | cs |
- 이 명령은 사용자 정의 위젯의 디자인을 나타내는 코드가 포함된 “custom_widget_ui.py”라는 Python 파일을 생성합니다.ui
[Python 코드 작성 – from custom_widget_ui]
- 별도의 Python 파일을 만들고 “main.py”라고 하고 필요한 모듈을 가져옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from PyQt6.QtWidgets import QApplication, QWidget from custom_widget_ui import Ui_CustomWidget # Import the generated custom widget class class CustomWidget(QWidget, Ui_CustomWidget): def __init__(self): super().__init__() self.setupUi(self) if __name__ == ‘__main__’: app = QApplication([]) widget = CustomWidget() widget.show() app.exec() | cs |
- 이 코드에서 필요한 모듈을 가져오고 “custom_widget_ui.py”에서 생성된 사용자 방지 위젯 클래스( Ui_CustomWidget)를 가져옵니다.
- QWidget및 Ui_CustomWidget모두 상속되는 새 클래스를 CustomWidget정의합니다.
- init메서드 내에서 setupUi(self)호출하여 생성된 코드를 사용하여 사용자 정의 위젯을 설정합니다.
- if name == ‘main‘:블록에서 QApplication제작을 CustomWidget제한하고 표시하고 애플리케이션 이벤트 루프를 시작합니다.
3. PyQt6 사용자 지정 위젯 활용
PyQt6에서 사용자 지정 위젯을 만들면 기존 위젯보다 더 큰 유연성과 기능을 제공하는 애플리케이션을 만들 수 있습니다. 예를 들어, 사용자 지정 위젯을 사용하여 데이터베이스 연결, 파일 열기 및 저장, 그래픽 표시 등을 수행하는 애플리케이션을 만들 수 있습니다. 자신만의 구성 요소를 만들어 애플리케이션을 더욱 효율적이고 유연하게 만들 수 있습니다.



FileSelectionWidget이 예제에서는 사용자가 파일을 선택할 수 있도록 하는 사용자 지정 위젯을 만듭니다 . 위젯은 QPushButton파일 선택 대화 상자를 트리거하는 것과 QLabel선택한 파일 경로를 표시하는 것으로 구성됩니다.
메서드 내부에서 init_ui레이아웃을 설정하고 clicked의 신호를 메서드 select_file_button에 연결합니다 select_file.
이 select_file메서드는 사용자가 버튼을 클릭할 때 트리거됩니다. QFileDialog사용자가 파일을 선택할 수 있는 곳이 열립니다 . 파일을 선택하면 파일 경로가 에 표시됩니다 selected_file_label.
코드를 실행하면 사용자 정의 위젯이 표시되며 사용자는 “파일 선택” 버튼을 클릭하여 파일을 선택할 수 있습니다. 그러면 선택한 파일 경로가 위젯에 표시됩니다.
사용자 정의 위젯에 추가 기능을 추가하거나 애플리케이션 요구 사항에 따라 다른 기능으로 다른 사용자 정의 위젯을 생성하여 이 예제를 확장할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | from PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, QLabel, QFileDialog class FileSelectionWidget(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): layout = QVBoxLayout() self.selected_file_label = QLabel(“No file selected”) select_file_button = QPushButton(“Select File”) select_file_button.clicked.connect(self.select_file) layout.addWidget(select_file_button) layout.addWidget(self.selected_file_label) self.setLayout(layout) def select_file(self): file_dialog = QFileDialog() file_path, _ = file_dialog.getOpenFileName(self, “Select File”) if file_path: self.selected_file_label.setText(file_path) if __name__ == ‘__main__’: app = QApplication([]) widget = FileSelectionWidget() widget.show() app.exec() | cs |
4. 결론 및 의견
사용자 지정 위젯을 만드는 것은 모든 PyQt6 개발자에게 권장되는 기술입니다. 사용자 지정 위젯을 만들면 더욱 효율적이고 유연한 애플리케이션을 만들 수 있습니다. 이제 PyQt6 QT Designer 사용자 지정 위젯 방을 알게되었으니, 여러분도 한번 도전해보세요!
[관련글]