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 애플리케이션을 만들 수 있습니다.