Python/PyQt5

[PyQt5] 7. Qt Designer

컴닥 2021. 5. 20. 21:22
반응형

Qt Designer 의 설치 경로

Qt Designer는 pyqt5-tools 패키지를 설치한 뒤 다음 경로에서 찾을 수 있습니다. 

path_of_projects\venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

바로가기를 프로젝트 폴더에 만들어 두는 게 편합니다. 

객체 탐색기

객체 탐색기로 객체의 트리 구조를 보면서 작업합니다. 

 

미리 보기

CTRL+R으로 미리 보기 하면서 작업합니다. 

.ui 파일

GUI를 만든 뒤 .ui 라는 확장자로 저장할 수 있고,
이 파일은 XML 형식의 텍스트 파일입니다. 

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QWidget" name="widget" native="true">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <property name="leftMargin">
       <number>0</number>
      </property>
      <property name="topMargin">
       <number>0</number>
      </property>
      <property name="rightMargin">
       <number>0</number>
      </property>
      <property name="bottomMargin">
       <number>0</number>
      </property>
      <item>
       <widget class="QLineEdit" name="lineEdit"/>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton">
        <property name="text">
         <string>PushButton</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QPlainTextEdit" name="plainTextEdit">
     <property name="enabled">
      <bool>false</bool>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_07-1.ui

 

.ui 파일을 파이썬 코드(.py)로 변환하기

Qt Designer 이용

단 PySide2 기반의 코드입니다. 

UIC 이용

path_of_projects\venv\Lib\site-packages\PyQt5\uic

에 있는 pyuic.py 파일을 이용해서 변환할 수 있습니다. 
(인수의 대소문자에 주의)

venv 환경 아래에서는 이렇게 하면 됩니다. 

python -m PyQt5.uic.pyuic -x pyqt5_study_07-1.ui -o pyqt5_study_07-1.py

이런 코드를 얻을 수 있었습니다. 

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.lineEdit = QtWidgets.QLineEdit(self.widget)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.verticalLayout.addWidget(self.widget)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(Form)
        self.plainTextEdit.setEnabled(False)
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.verticalLayout.addWidget(self.plainTextEdit)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_07-1.py

 

.ui 파일을 바로 불러오기

.ui 파일을 파이썬 코드로 변환하지 않고 바로 불러 올 수 있습니다. 

from PyQt5.QtWidgets import *
from PyQt5 import uic

ui = uic.loadUiType('pyqt5_study_07-1.ui')[0]


class MyWindow(QWidget, ui):
    def __init__(self):
        super().__init__()
        self.setupUi(self)


app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_07-2.py

만약 최상위 위젯이 QWidget이 아닌 QMainWindow 등으로 ui 파일을 작성하였다면,
클래스를 작성 시 당연히 그 위젯(QMainWindow 등)을 상속해야 합니다. 

끝까지 봐주셔서 감사합니다. 

반응형