본문 바로가기
Python/PySide PyQt

[PySide6] QUiLoader 를 Qt Designer의 .ui 사용하기.

by ds31x 2024. 5. 6.

QUiLoader

QUiLoader
Qt 프레임워크에서 Qt Designer 로 생성된 .ui 파일을
runtime(런타임)에서 로딩하여 widget으로 생성하는 역할을 수행함.

  • .ui 파일들은 Qt Designer라는 도구를 사용하여 XML 형식으로 만들어졌으며,
  • 이 파일들은 사용자 인터페이스의 레이아웃과 속성을 정의하고 있음.

QUiLoader의 사용은 code를 통한 직접적인 인터페이스 구현이 아닌 GUI Tool인 Qt Designer를 사용가능하게 하여 다음의 장점을 가짐.

  1. 개발 과정을 간소화시킴.
  2. 인터페이스의 변경이 프로그램 코드를 수정하지 않고도 가능하게 함 (.ui 파일만 재작성)
  3. 이는 전체적인 유지 보수의 편리성을 제공할 수 있음.

참고로, .ui를 사용하는 다른 방법은

  • pyside6-uic command line program을 이용하여
  • .ui 파일을 Python code로 변환하고,
  • 해당 code에 정의된 widget 클래스를 상속하는 방식을 통해

Qt GUI Application을 구현하는 방법이 있음.

pyside6-uic design.ui -o ui_design.py

사용법

  1. QUiLoader 객체를 만들고,
  2. load() 메소드를 호출하여 .ui 파일에 해당하는 QFile 객체를 넘겨주면,
  3. 이 메소드는 해당하는 .ui 파일을 읽고 이를 통해 widget을 동적으로 생성하여 반환함.
  4. 동적으로 생성된 widget은 바로 애플리케이션에 통합되어 사용될 수 있음.

Example

다음의 Python code snippet은

  • PySide6 라이브러리를 사용하여
  • Qt Designer를 통해 생성된 .ui파일을 이용하여
  • 간단한 GUI(Graphical User Interface) 어플리케이션을 생성하는 방법을 보여줌.

아래의 QLineEdit 객체에서 문자열을 입력하고 엔터를 누르면, 위의 QLabel 객체의 text이 Hello <입력된 문자열>로 갱신됨.

Ex1_QtDesigner.ui
0.00MB


아래 이미지 참고.

이는

  • QtUiTools.QUiLoader를 사용하여 Qt Designer가 생성한 .ui파일에 해당하는 widget을 만들고
  • 이를 이용하여 GUI Application을 만드는 방법을 보여줌.
  • uic를 이용하는 경우엔 상속이 이용되는 것과 달리  자신의 attribute로 사용하는 차이점을 가짐 (has-a relation을 이용).
import os, sys

from PySide6.QtWidgets import (
        QApplication,
        QMainWindow,
        )
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile

class MW (QMainWindow):
    def __init__(self, ui_fstr):
        super().__init__()
        self.wnd = self.ds_get_wnd_from_ui(ui_fstr)
        self.ds_setup()
        self.setCentralWidget(self.wnd)
        self.show()


    def ds_setup(self):
        self.wnd.lineEdit.returnPressed.connect(self.ds_update_label)

    def ds_update_label(self):
        self.wnd.label.setText(f'Hello, {self.wnd.lineEdit.text()}')

    def ds_get_wnd_from_ui(self, ui_fstr):
        ui_loader = QUiLoader()
        root_dir = os.path.dirname(__file__)
        ui_path = os.path.join(root_dir, ui_fstr)

        ui_file = QFile(ui_path)
        ui_file.open(QFile.ReadOnly)
        wnd = ui_loader.load(ui_file, None)
        ui_file.close()

        return wnd

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mwd = MW('Ex1_QtDesigner.ui')
    sys.exit(app.exec())