PySideをはじめよう!設計の基本!クラスを継承して使いまわそう

PySideを使って簡単なボタン付きウインドウを作ってみましょう。
PySideで作ったベースクラスを継承し、Mayaでカスタムして使うといった
一連の流れをやってみました。

管理人がYouTubeで解説!

PySideってなに?

GUIを構築するのに特化したクロスプラットフォームなライブラリです。
PySideというよりもQtといった方が馴染み深いのかもしれません。
Qt for Python | 公式Pythonバインディング

PySideはMayaに同梱されている豪華なGUIが作れるライブラリと思ってもらえると良いでしょう。
概要はAutodesk Maya 2020のヘルプを見るのが良いでしょう。
Maya で PySide を使用する | Maya 2020 | Autodesk Maya ヘルプ

PySideを使うメリット

Mayaコマンドを使ってもGUIを作ることができますが、
あえてPySideを使う理由はなんでしょうか?

よく言われるのがシャレオツなUIを作れる!ってのがありますね。
もちろんPySideじゃないと作るのが難しいUIとかもあります。
コントロールリグのピッカーとかもMayaに用意されたコマンドだけでは難しいですね。

ただ、一番の強みは継承して使いまわせることだと私は思います。

例えば、ベースとなるクラスを作って、
そのベースクラスをMayaで使ったり、Houdiniで使ったりと汎用的な使い方ができます。


もちろんMaya内部だけでも1つのベースクラスを使い回すこともできます。
Mayaの中だとオプションウインドウは使いまわしていますよね。

UE4でいうマテリアルとマテリアルインスタンスの仕組みのようなものですね。
※ UE4わからない方すみません。

元を直せば全てに反映されるので、いちいちユニークなGUI設計をする必要がないのが強みですね!
一括修正一括変更をしやすいGUI設計ができる!というのが強みでしょうか。

サンプルコード

# coding: utf-8
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *

# Mayaとは依存関係のない単なるボタン付きウインドウ
class SimpleButtonUIBase(QWidget):    
    def __init__(self, *args, **kwargs):
        super(SimpleButtonUIBase, self).__init__(*args, **kwargs)
        
        # ウインドウのタイプを決める
        self.setWindowFlags(Qt.Window)

        # ウインドウのオブジェクト名とタイトル名を設定する
        self.setObjectName('simple_button')        
        self.setWindowTitle('Simple Button')

        # いろいろ作る部分
        # 1.レイアウトを作る
        main_layout = QVBoxLayout(self)
        # 2.部品を作る
        self.buttonA = QPushButton("Button A", self)
        self.buttonB = QPushButton("Button B", self)
        # 3.部品をレイアウトに追加する
        main_layout.addWidget(self.buttonA)
        main_layout.addWidget(self.buttonB)
        # 4.部品をクリックした時の振る舞いを作る
        self.buttonA.clicked.connect(self.buttonA_onClicked)
        self.buttonB.clicked.connect(self.buttonB_onClicked)

    def buttonA_onClicked(self):
        print("ButtonA Clicked.")

    def buttonB_onClicked(self):
        print("ButtonB Clicked.")


# Mayaと依存関係のないウインドウ
window_instance = SimpleButtonUIBase()
window_instance.show()


##########################################################
# ここからMaya依存にしたGUIを作っていきます。
##########################################################
from maya import cmds
from maya import OpenMayaUI as omui
from shiboken2 import wrapInstance

# SimpleButtonUIBase継承したMaya用のクラス
class MayaSimpleButtonUI(SimpleButtonUIBase):
    def __init__(self, parent):
        super(MayaSimpleButtonUI, self).__init__(parent)
        self.setWindowTitle("Create Primitive")
        self.buttonA.setText("Poly Cube")
        self.buttonB.setText("Poly Sphere")
        
    def buttonA_onClicked(self):
        print("Maya ButtonA Clicked")
        cmds.polyCube()
        
    def buttonB_onClicked(self):
        print("Maya ButtonB Clicked")
        cmds.polySphere()


# mayaのメインウインドウを取得する
def get_maya_main_window():
    omui.MQtUtil.mainWindow()
    ptr = omui.MQtUtil.mainWindow()
    widget = wrapInstance(long(ptr), QWidget)
    return widget


# 依存関係のないウインドウを継承して作ったMaya用のボタンUI
maya_window_instance = MayaSimpleButtonUI(parent=get_maya_main_window())
maya_window_instance.show()

参考リンク

setWindowFlagsを使いこなす!! | KIWAMIDEN

関連記事

  1. Bifrostでレイキャストしてみよう!

    2020-12-18

  2. リガーのお仕事のお話|『階層構造の設計について』語ってみる

    2020-11-19

  3. Blend Shapeが壊れる?Transfer Vertex Orderで解決だ!

    2021-09-13

  4. DirectX11(HLSL)シェーダーを使ってみよう!

    2021-03-17

コメント

ABOUT

テクニカルアーティストの為のまとめサイトです。

本サイトでは、『YouTube ✕ Blog』を中心に
情報発信をしていきます。

また、テクニカルアーティストとしての様々な
ライフハック記事も投稿予定です。

限定情報会員

PATREONでは、限定情報やサンプルファイルの配布も行っています。登録頂けると更新頑張れます。支援の方よろしくお願いします。


免責事項

本ウェブサイト内で公開している全ての情報の有用性や安全性については当方は一切の保証を与えるものではありません。
利用したことによって引き起こる直接および間接的な損害に対して当方は一切責任を負うものではありません。
全て自己責任でご使用ください。

3DCGBOOK出版

BOOTHで技術書を販売利しております。







スポンサー

ページ上部へ戻る