Maya控件內嵌到PySide2(colorSliderGrp)

在這裏插入圖片描述

# -*- coding: utf-8 -*-
"""
Author: Virgil
Date: 2020/5/23 13:18
"""

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
from shiboken2 import wrapInstance
from functools import partial

import maya.OpenMayaUI as omui
import maya.cmds as cmds
import maya.mel as mel

def maya_main_window():
    """
    Return the Maya main window widget as a Python object
    """
    main_window_ptr = omui.MQtUtil.mainWindow()
    return wrapInstance(long(main_window_ptr), QtWidgets.QWidget)

class CustomColorButton(QtWidgets.QWidget):
    color_changed = QtCore.Signal(QtGui.QColor)

    def __init__(self, color=QtCore.Qt.white, parent=None):
        super(CustomColorButton, self).__init__(parent)

        self.setObjectName("CustomColorButton")

        self.create_control()
        self.set_size(250, 14)
        self.set_color(color)

    def create_control(self):
        """ 1. Create the colorSliderGrp"""
        window = cmds.window()
        color_slider_name = cmds.colorSliderGrp()

        """ 2. Find the colorSliderGrp widget"""
        self._color_slider_obj = omui.MQtUtil.findControl(color_slider_name)

        if self._color_slider_obj:
            self._color_slider_widget = wrapInstance(long(self._color_slider_obj), QtWidgets.QWidget)

            """ 3. Reparent the colorSliderGrp widget to this widget"""
            main_layout = QtWidgets.QVBoxLayout(self)
            main_layout.setObjectName("main_layout")
            main_layout.setContentsMargins(0, 0, 0, 0)
            main_layout.addWidget(self._color_slider_widget)


            """ 5. Identify/store the colorSliderGrp's child widgets (and hide if necessary)"""
            # children = self._color_slider_widget.children()
            # for child in children:
            #     print(child)
            #     print(child.objectName())
            # print("--------------------")

            self._slider_widget = self._color_slider_widget.findChild(QtWidgets.QWidget, "slider")
            # if self._slider_widget:
            #     self._slider_widget.hide()

            self._color_widget = self._color_slider_widget.findChild(QtWidgets.QWidget, "port")

            cmds.colorSliderGrp(self.get_full_name(), edit=True, changeCommand=partial(self.on_color_changed))

        cmds.deleteUI(window, window=True)

    def get_full_name(self):
        return omui.MQtUtil.fullName(long(self._color_slider_obj))

    def set_size(self, width, height):
        self._color_slider_widget.setFixedWidth(width)
        self._color_widget.setFixedHeight(height)

    def set_color(self, color):
        color = QtGui.QColor(color)

        cmds.colorSliderGrp(self.get_full_name(), edit=True, rgbValue=(color.redF(), color.greenF(), color.blueF()))
        self.on_color_changed()

    def get_color(self):
        # color = cmds.colorSliderGrp(self._color_slider_widget.objectName(), query=True, rgbValue=True)
        color = cmds.colorSliderGrp(self.get_full_name(), query=True, rgbValue=True)

        color = QtGui.QColor(color[0] * 255, color[1] * 255, color[2] * 255)
        return color

    def on_color_changed(self, *args):
        self.color_changed.emit(self.get_color())

class CustomDialog(QtWidgets.QDialog):
    WINDOW_TITLE = "Embedding Maya Controls"

    dlg_instance = None

    def __init__(self, parent=maya_main_window()):
        super(CustomDialog, self).__init__(parent)

        self.setWindowTitle(self.WINDOW_TITLE)
        self.setObjectName("EmbeddingMayaControls")
        self.setMinimumSize(200, 100)
        self.setWindowFlags(self.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint)

        self.foreground_color = QtGui.QColor(QtCore.Qt.white)
        self.background_color = QtGui.QColor(QtCore.Qt.black)

        self.create_widgets()
        self.create_layout()
        self.create_connections()

    def create_widgets(self):
        self.foreground_color_bttn = CustomColorButton(QtCore.Qt.white)
        self.background_color_bttn = CustomColorButton(QtCore.Qt.black)

        self.close_bttn = QtWidgets.QPushButton("Close")

    def create_layout(self):
        color_layout = QtWidgets.QFormLayout()
        color_layout.addRow("Foreground:", self.foreground_color_bttn)
        color_layout.addRow("Background:", self.background_color_bttn)

        color_grp = QtWidgets.QGroupBox("Color Options")
        color_grp.setLayout(color_layout)

        bttn_layout = QtWidgets.QHBoxLayout()
        bttn_layout.setSpacing(2)
        bttn_layout.addStretch()
        bttn_layout.addWidget(self.close_bttn)

        main_layout = QtWidgets.QVBoxLayout(self)
        main_layout.setContentsMargins(5, 5, 5, 5)
        main_layout.addWidget(color_grp)
        main_layout.addStretch()
        main_layout.addLayout(bttn_layout)

    def create_connections(self):
        # self.foreground_color_bttn.color_changed.connect(self.print_colors)
        # self.background_color_bttn.color_changed.connect(self.print_colors)

        self.foreground_color_bttn.color_changed.connect(partial(self.print_colors, bttn="Foreground"))
        self.background_color_bttn.color_changed.connect(partial(self.print_colors, bttn="Background"))

        self.close_bttn.clicked.connect(self.close)

    # def print_colors(self):
    #     fg_color = self.foreground_color_bttn.get_color()
    #     bg_color = self.background_color_bttn.get_color()
    #
    #     print("Foreground Color: [{0}, {1}, {2}]".format(fg_color.red(), fg_color.green(), fg_color.blue()))
    #     print("Background Color: [{0}, {1}, {2}]".format(bg_color.red(), bg_color.green(), bg_color.blue()))

    def print_colors(self, color, bttn):
        print("{0} Color: [{1}, {2}, {3}]".format(bttn, color.red(), color.green(), color.blue()))
    
def showWindow():
    global dialog
    try:
        dialog.close()
        dialog.deleteLater()
    except:
        pass

    dialog = CustomDialog()
    dialog.show()

if __name__ == "__main__":
    try:
        dialog.close()
        dialog.deleteLater()
    except:
        pass

    dialog = CustomDialog()
    dialog.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章