UI를 만들 때, 코드로 하나씩 만들어가는 방법도 알아야 하지만, 너무 비효율적이다. Qt에는 Qt Designer라는게 있고, UI 초안을 이걸로 만들면 매우 빠르게 생성할 수 있다.
Qt Designer 에서 Widget 배치하기
Qt Designer를 처음 접했을 때, Widget들을 어떻게 배치할지 난감했다. 이걸 기록하는 이유도 난감했던 기억을 잊지 않기위해 하는 것이다. 코드로 UI를 구성할 때, Layout으로 Widget의 배치를 한다는걸 알 수 있다. 이를 이용하면 되지만, 직접해보면 탑다운 형태로 만들어 가는건 어렵다. 작은 부분부터 하나씩 아래에서 조립해 올라가야 한다. 간단한 시연영상을 만들어 봤다.
사용할 Widget들을 드래그해서 윈도우에 생성하고, 작은 부분부터 조립하듯이 레이아웃으로 묶으며 만들어간다. 여러개의 Widget을 선택한 후, 마우스 오른쪽 버튼을 누르면 ‘배치’항목이 있는데 이걸 이용하면 가능하다.
Widget이나 Layout의 이름은 필수로 알아보기 쉽게 지정한다. widget의 배치 비율을 달리해야 하는경우, 필요하면 Spacer를 넣어 빈 공간을 만들고 layoutStretch 속성으로 각 위젯의 비율을 맞춰준다.
영상에서는 보여주지 않았지만, 오른쪽 노란색으로 보이는 영역에 widget의 property를 설정해주는 항목이 있다. 이 설정을 이용해서 기본적인 설정들을 해준다.
sizePolicy property 와 sizeHint
property들중 중요한게 sizeHint와 sizePolicy 속성이다. widget의 기본크기및 크기변경에 대한 동작이 이 설정에 의해 정해진다. size에 대해 minimum과 maximum값들도 존재하지만, 주의할 점은 이 size 관련 properties들이 sizeHint와 직접적 관련이 없다. 예를들어, QLineEdit의 경우 font에 의존성을 가지는 고정 높이를 갖게된다. 만약, sizeHint()값을 변경하고 싶으면, minimum, maximum 속성을 동일하게 만들거나, 코드에서 메소드를 오버라이드해야 한다. 간단하게 sizePolicy들을 알아보면 다음과 같다.
- QSizePolicy.Fixed : sizeHint()의 크기로 고정
- QSizePolicy.minimum : sizeHint() 가 minimum이 된다. 이보다 작아질 수 없음.
- QSizePolicy.maximum : sizeHint() 가 maximum이 된다. 이보다 커질 수 없음.
- QSizePolicy.Preferred : sizeHint()가 최적의 크기이나 크기변경 가능. 최소 크기는 minimumSizeHint()로 정해진다.
- QSizePolicy.Expanding : sizeHint()가 최적의 크기이지만, 더 작아질 수 있다. 공간이 더 커지는 경우에(Expanding) 그 공간을 다 사용하게된다. 예로 수평 슬라이더가 있다.
- QSizePolicy.MinimumExpanding : sizeHint()가 최소이면서 최적의 크기이다. 마찬가지로 공간이 더 늘어나면 그 공간을 더 사용한다.
- QSizePolicy.Ignored : sizeHint()가 무시된다.
pyside2-uic : ui -> py 파일 변환
QT Designer에서 ui 파일을 완성하면, python파일로 변환이 가능하다. pyside2 를 설치하면 사용가능한 pyside2-uic 커맨드를 사용한다. 변환할 ui파일을 인자로 주고 -o 옵션으로 출력할 파일명을 적는다.
$ pyside2-uic.exe music_player.ui -o playerUI.py
생성된 ui python 파일은 그대로 사용가능하나, 다음처럼 QMainWindow나 QWidget을 상속받은 클래스를 하나 만들고, 그 안에 포함시켜 사용하는게 편하다.
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
...
MainWindow로 생성하면 QT Designer에서 생성된 클래스가 Ui_MainWindow이고, ui 생성하는 메소드로 setupUi()가 제공된다. 이를 실행하기 위한 메인함수는 다음과 같다.
def main():
app = QApplication(sys.argv)
main_view = MainWindow()
main_view.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
참고 링크
– https://wikidocs.net/36590