2024年8月8日木曜日

PySide6에서 QUiLoader를 利用한 UI 파일 런타임 로딩

PySide6에서 QUiLoader를 이용한 UI 파일 런타임 로딩과 위젯 통합 관리

PySide6에서 QUiLoader를 이용한 UI 파일 런타임 로딩과 위젯 통합 관리

PySide6를 사용하여 Qt Designer로 만든 UI 파일을 런타임에 로드하고, 위젯을 효과적으로 관리하는 방법에 대해 알아보겠습니다. 이 방법을 통해 UI 디자인과 로직을 분리하여 유지보수성을 높일 수 있습니다.

1. 필요한 모듈 임포트

먼저 필요한 모듈들을 임포트합니다:

import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile, QIODevice
from PySide6.QtWidgets import QApplication, QWidget

2. MainWindow 클래스 정의

QWidget을 상속받아 MainWindow 클래스를 정의합니다:

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        try:
            ui_file = QFile("layout.ui")
            if not ui_file.open(QIODevice.ReadOnly):
                print(f"Cannot open {ui_file.fileName()}: {ui_file.errorString()}")
                sys.exit(-1)
            
            loader = QUiLoader()
            self.ui = loader.load(ui_file, self)  # self를 인자로 전달
            ui_file.close()
            
            if not self.ui:
                print(loader.errorString())
                sys.exit(-1)
            
            self.ui.btn_Test.clicked.connect(self.on_btn_test_clicked)
            
        except Exception as e:
            print(f"Error: {e}")
            print("Please check the file name of the .ui file")

    def on_btn_test_clicked(self):
        self.ui.test_label.setText("Hello Qt")
        
    def closeEvent(self, event):
        print("closeEvent")
        super().closeEvent(event)

3. UI 파일 로딩과 위젯 통합 관리

QUiLoader.load() 메서드를 사용할 때 self를 두 번째 인자로 전달합니다:

self.ui = loader.load(ui_file, self)

이렇게 하면 UI 파일에서 정의된 위젯들이 현재 클래스(MainWindow)의 자식 위젯으로 통합됩니다. 이는 위젯 계층 구조를 유지하면서 메모리 관리를 효율적으로 할 수 있게 해줍니다. 또한, UI 파일에서 정의한 위젯들을 self.ui를 통해 쉽게 접근할 수 있게 됩니다.

4. closeEvent 메서드 오버라이딩

closeEvent는 QWidget 클래스의 가상 함수입니다. MainWindow 클래스가 QWidget을 상속받았기 때문에 이 메서드를 오버라이드할 수 있습니다:

def closeEvent(self, event):
    print("closeEvent")
    super().closeEvent(event)

이 메서드는 창이 닫히기 직전에 호출됩니다. 여기에서 필요한 정리 작업을 수행할 수 있습니다. super().closeEvent(event)를 호출하여 기본 동작도 유지합니다.

5. 메인 실행 코드

애플리케이션을 실행하는 메인 코드를 작성합니다:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())  # PyQt6에서는 exec_() 대신 exec()를 사용합니다

결론

이 방식을 사용하면 Qt Designer로 만든 UI 파일을 런타임에 동적으로 로드하고, 위젯들을 효과적으로 통합 관리할 수 있습니다. QUiLoader.load()self를 전달함으로써 UI 파일의 위젯들을 현재 클래스의 자식으로 만들어 관리를 용이하게 합니다.

또한, QWidget의 가상 함수인 closeEvent를 오버라이딩하여 창이 닫힐 때의 동작을 커스터마이즈할 수 있습니다. 이는 QWidget을 상속받았기 때문에 가능한 것으로, 객체 지향 프로그래밍의 장점을 잘 활용한 예입니다.

이러한 방식을 통해 UI 디자인과 로직을 분리하고, 위젯을 효과적으로 관리하며, 창 닫힘과 같은 이벤트를 세밀하게 제어할 수 있는 유연하고 관리하기 쉬운 PySide6 애플리케이션을 만들 수 있습니다.

0 件のコメント:

ラベル