【Maya Python】 QtDesigner로 만든 .ui를 Maya로 표시

소개



【Maya Python】 스크립트의 내용을 씹는 1 , 2 , 3 으로 쓴 스크립트를 작성하는 방법은 작은 스크립트에서는 문제가 되지 않지만 복잡한 UI를 만들려고 하면 힘든 노력이 필요합니다.
그래서 QtDesigner 을 사용하여 UI를 조립해 보겠습니다.
CG 아티스트로서는 스크립트로 고민하는 것보다 이런 알기 쉬운 툴이 있으면 좋네요.
이번에는 우선 만져보고 느낌을 잡기 위해 Maya에서 UI를 표시하고 간단한 동작을 시키는 곳까지 만들고 싶습니다.
PySide와 PySide2, PyQt5 등의 방법이 산견되고 있으므로 자신의 비망록도 겸해 씁니다.
운영 환경은 Maya2019,2020입니다.

UI 파일 준비



우선 이런 느낌으로 UI를 만들어 보았습니다.


만드는 방법에 대해서는 이 사이트를 참고.

PyQt5와 python3을 통한 GUI 프로그래밍 : 연습편 [0]
제5장 Qt Designer를 사용해 보자
QtDesigner로 UI 만들기

조금 막힌 곳을 메모



레이아웃 설정을 단단히 수행
그대로 배치했을 뿐이라면, 윈도우 사이즈를 변경해도 UI가 추종해 주지 않거나, 윈도우 시작시에 윈도우가 너무 작다 등 일어나 버린다.

그림과 같이 centralwidget이 brakeLayout이 되어 있으면 전부 표시해주지 않는다.

레이아웃을 설정하고 윈도우 크기를 조정한 후 Size Constraints에서 최소 크기를 설정합니다. 그러면 제대로 맞은 상태의 창을 만들 수 있다. 윈도우 사이즈를 변경해도 UI가 추종해 준다.

레이아웃 설정 후 초기 시작시 다이어그램

창을 표시하는 프로그램 준비



일단 코드 전문
# -*- coding: utf-8 -*-
from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin

# パスを直接指定
UIFILEPATH = 'C:/Users/YN/Desktop/testUI.ui'

## MainWindowを作るクラス
class MainWindow(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        # UIのパスを指定
        self.UI = QUiLoader().load(UIFILEPATH)
        # ウィンドウタイトルをUIから取得
        self.setWindowTitle(self.UI.windowTitle())
        # ウィジェットをセンターに配置
        self.setCentralWidget(self.UI)

        # ボタンを接続
        self.UI.refreshPushButton.clicked.connect(self.refreshPushButton)

    def refreshPushButton(self):
        print ('refresh')

## MainWindowの起動
def main():
    window = MainWindow()
    window.show()

if __name__ == '__main__':
    main()


스크립트 편집기에 복사하여,UIFILEPATH 를 방금 만든 ui의 경로로 설정합니다.
그리고 실행하면 일단 작성한 UI를 Maya에서 확인할 수 있습니다.


프로그램 상세



UI 로드


from PySide2.QtUiTools import QUiLoaderUI를 로드하려면 QtUiTools에서 QUiLoader를 가져옵니다.
self.UI = QUiLoader().load(UIFILEPATH)UIFILEPATH 를 로드하고 self.UI 로 인스턴스화합니다.

UI에서 값 가져오기


self.setWindowTitle(self.UI.windowTitle())윈도우 타이틀을 지정하지 않으면 적당한 이름으로 윈도우가 작성되기 때문에 윈도우 타이틀을 작성한 UI 파일로부터 취득합니다. 물론 여기에 string 로 입력하는 것도 가능합니다.self.UI.windowTitle()UI 안의 프로퍼티명을 지정하면 거기에 설정되어 있는 값을 취득할 수 있습니다.

이와 같이 설정해 두면 프로그램으로 재작성하지 않아도 UI 파일을 변경하면 좋기 때문에 편리합니다.

UI 배치


self.setCentralWidget(self.UI)UI를 배치합니다.

버튼 동작 만들기


self.UI.refreshPushButton.clicked.connect(self.refreshPushButton)objectName이 refreshPushButton인 버튼에 클릭할 때 기능을 연결합니다.

이와 같이 QtDesigner로 오브젝트명을 지정해 둡니다.
    def refreshPushButton(self):
        print ('refresh')

버튼을 눌렀을 때, refresh와 프린트하는 기능을 붙였습니다.
실제로는 여기에 이 ​​버튼에 설정하고 싶은 기능을 써 갑니다.

결론



저도, 처음은 어디에서 손을 붙이면 좋을지 암중 모색 상태였으므로, 뭔가 도움이 된다고 생각합니다.
Maya에서 우선 바삭바삭하게 UI 표시해 아-, 이렇게 되어 있는 것이라는 것을 알고 있으면 자꾸자꾸 UI를 복잡하게 해 갈 수 있지 않을까요.

Maya의 PySide2는 도중에 PySide에서 업데이트가 있었고, 설명의 방식이 바뀌었기 때문에 혼란했습니다. 또한 비슷한 PyQt5 등 검색에 히트 해 버리기 때문에 더욱 다소 네요. .

참고



매우 참고가 되었습니다. 감사합니다.

PyQt5와 python3을 통한 GUI 프로그래밍 : 연습편 [0]
제5장 Qt Designer를 사용해 보자
QtDesigner로 UI 만들기

좋은 웹페이지 즐겨찾기