PySideでのUI作成はわかりやすくていいんですが、スライダと一体になったMayaのUIなども捨てがたく両方とも使いたい場合。
例としてアウトライナでの表示色を設定するダイアログです。下段のボタン3つはQPushButtonです。上段はColorSliderGrpでMayaの標準のUIです。PySideとMaya標準UIが混在しています。ベースはQWidgetを使って作成&レイアウトされたウィンドウになります。
厳密には両方同じQtなので「混在」ではありませんが、それはさておき、、、
混在させると一口に言っても、
- PySideでレイアウトされたGUIへMaya標準UIをアタッチする
- Maya標準UI レイアウトへPySide.QtGuiのウィジットをアタッチする
の2通りがあると考えられますが、今回は1の方法です。
PySideでレイアウトされたUI(QLayoutを使用したレイアウト)へMayaの標準のUIを表示するには、setParentする先のレイアウト名の文字列が必要になります。
このとき、setParentできるように、setObjectName()を使用してQLayoutへ名前をつけますが、すでに同じ名前のものがある場合などはそちらにアタッチされるかもしれませんので、必ずユニークな名前をつけておきます。ユニーク名前のためにuuidモジュールを使用します。
import uuid print str(uuid.uuid4())
とすると、ランダムなUUID文字列が取り出せます。まぁまぁランダムなものなのだそうで、適当なレイアウト名にこれを追加してユニークなオブジェクト名とします。
あとはsetParent(オブジェクト名)とすれば以降に作成するMayaのUIコントロールが指定したレイアウトへアタッチされていきます。
以下がスクリプトのサンプルです。メインになる実装は省いています。全ての実装を含み機能するモノは投稿の最後にあります。
# coding: utf-8
'''Set outliner color to selected objects
Example: Regist to shelf following 2 line as Python
import HtSetOutlinerColor
HtSetOutlinerColor.main()
Auther: Hiroshi Takashima, Canplaize Inc.
License: CC BY-SA 4.0
'''
import pymel.core as pm
import uuid
from maya.cmds import colorManagementConvert #2016.5 pymelにないので拝借
from pymel.core.language import Mel as mel
try:
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
except ImportError:
from PySide.QtCore import *
from PySide.QtGui import *
import maya.OpenMayaUI as omui
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
class HtSetOutlinerColorDialog(MayaQWidgetBaseMixin,QWidget):
def __init__(self, *args, **kwargs):
super(HtSetOutlinerColorDialog, self).__init__(*args, **kwargs)
self.closeOtherInstance()
self.setAttribute(Qt.WA_DeleteOnClose, True)
self.initUI()
def initUI(self):
self.setWindowTitle("Set Outliner color")
#Main Layout
self.layout_main = QVBoxLayout()
#ユニークなオブジェクト名をつける
self.layout_main.setObjectName("HtSetOutlinerColorDialog_mainLayout_" + str(uuid.uuid4()))
self.setLayout(self.layout_main)
#add Maya UI to QHBoxLayout
pm.setParent(self.layout_main.objectName()) #名付けたオブジェクト名を使用してsetParent()
self.pmColorSliderGrp = pm.uitypes.ColorSliderGrp()
layout_ApplyCloseButton = QHBoxLayout()
self.Button_disableColor = QPushButton("Don't Use")
self.Button_apply = QPushButton("Apply")
self.Button_close = QPushButton("Close")
layout_ApplyCloseButton.addWidget(self.Button_disableColor)
layout_ApplyCloseButton.addStretch()
layout_ApplyCloseButton.addWidget(self.Button_close)
layout_ApplyCloseButton.addWidget(self.Button_apply)
self.layout_main.addLayout(layout_ApplyCloseButton)
self.Button_disableColor.clicked.connect(self.clickDisableColor)
self.Button_close.clicked.connect(self.clickClose)
self.Button_apply.clicked.connect(self.clickApply)
def clickDisableColor(self):
pass
def clickClose(self):
self.close()
def clickApply(self):
pass
def closeOtherInstance(self):
[widget.close() for widget in self.parent().findChildren(self.__class__) if widget is not self]
def main():
dlg = HtSetOutlinerColorDialog()
dlg.show()
return dlg
if __name__ == '__main__':
main()
ダウンロード:HtSetOutlinerColor
WindowsのMaya2016 Ext2と2017で動作確認済みです。
スクリプトフォルダへ「__init__.py」を含むHtSetOutlinerColorフォルダをコピーし、
import HtSetOutlinerColor HtSetOutlinerColor.main()
をShelfへ登録し実行です。

0 件のコメント:
コメントを投稿