# -*- coding: utf-8 -*-
"""
Author: administrator
Date: 2020/5/9 14:57
"""
from PySide2 import QtCore
from PySide2 import QtWidgets
from shiboken2 import wrapInstance
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 CustomDialog(QtWidgets.QDialog):
WINDOW_TITLE = "Table Example"
VALUE_ROLE = QtCore.Qt.UserRole
ATTR_ROLE = QtCore.Qt.UserRole + 1
def __init__(self, parent=maya_main_window()):
super(CustomDialog, self).__init__(parent)
self.setWindowTitle(self.WINDOW_TITLE)
self.setMinimumSize(600, 400)
self.setWindowFlags(self.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint)
self.create_widgets()
self.create_layout()
self.create_connections()
def create_widgets(self):
self.table_widget = QtWidgets.QTableWidget()
self.table_widget.setColumnCount(5)
self.table_widget.setColumnWidth(0, 30)
self.table_widget.setColumnWidth(2, 100)
self.table_widget.setColumnWidth(3, 100)
self.table_widget.setColumnWidth(4, 100)
self.table_widget.setHorizontalHeaderLabels(["", "Name", "TranslateX", "TranslateY", "TranslateZ"])
header = self.table_widget.horizontalHeader()
header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch)
self.refresh_bttn = QtWidgets.QPushButton("Refresh")
self.close_bttn = QtWidgets.QPushButton("Close")
def create_layout(self):
bttn_layout = QtWidgets.QHBoxLayout()
bttn_layout.addStretch()
bttn_layout.addWidget(self.refresh_bttn)
bttn_layout.addWidget(self.close_bttn)
main_layout = QtWidgets.QVBoxLayout(self)
main_layout.setContentsMargins(2, 2, 2, 2)
main_layout.addWidget(self.table_widget)
main_layout.addLayout(bttn_layout)
def create_connections(self):
self.table_widget.cellChanged.connect(self.on_cell_changed)
self.refresh_bttn.clicked.connect(self.refresh_table)
self.close_bttn.clicked.connect(self.close)
def showEvent(self, event):
super(CustomDialog, self).showEvent(event)
self.refresh_table()
def refresh_table(self):
self.table_widget.cellChanged.disconnect(self.on_cell_changed)
self.table_widget.setRowCount(0)
meshes = cmds.ls(type="mesh")
for i in range(len(meshes)):
transform_name = cmds.listRelatives(meshes[i], parent=True)[0]
translate = cmds.getAttr("{0}.translate".format(transform_name))[0]
visible = cmds.getAttr("{0}.visibility".format(transform_name))
self.table_widget.insertRow(i)
self.insert_item(i, 0, "", "visibility", True)
self.insert_item(i, 1, transform_name, None, False)
self.insert_item(i, 2, self.float_to_string(translate[0]), "tx", False)
self.insert_item(i, 3, self.float_to_string(translate[1]), "ty", False)
self.insert_item(i, 4, self.float_to_string(translate[2]), "tz", False)
self.table_widget.cellChanged.connect(self.on_cell_changed)
def insert_item(self, row, column, text, attr, boolean):
item = QtWidgets.QTableWidgetItem(text)
self.set_item_value(item, text)
self.set_item_attr(item, attr)
if boolean:
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setCheckState(QtCore.Qt.Checked)
self.table_widget.setItem(row, column, item)
def on_cell_changed(self, row, column):
item = self.table_widget.item(row, column)
if column == 1:
self.rename(item)
else:
boolean = column == 0
self.update_attr(self.get_full_attr_name(row, item), item, boolean)
def rename(self, item):
old_name = self.get_item_value(item)
new_name = self.get_item_text(item)
if old_name != new_name:
actual_new_name = cmds.rename(old_name, new_name)
if actual_new_name != new_name:
self.set_item_text(item, actual_new_name)
self.set_item_value(item, actual_new_name)
def update_attr(self, attr_name, item, boolean):
if boolean:
value = self.is_item_checked(item)
self.set_item_text(item, "")
else:
text = self.get_item_text(item)
try:
value = float(text)
except ValueError:
self.revert_original_value(item, boolean)
return
try:
cmds.setAttr(attr_name, value)
except:
self.revert_original_value(item, boolean)
return
new_value = cmds.getAttr(attr_name)
if boolean:
self.set_item_checked(item, new_value)
else:
self.set_item_text(item, self.float_to_string(new_value))
self.set_item_value(item, new_value)
def set_item_text(self, item, text):
item.setText(text)
def get_item_text(self, item):
return item.text()
def set_item_attr(self, item, attr):
item.setData(self.ATTR_ROLE, attr)
def get_item_attr(self, item):
return item.data(self.ATTR_ROLE)
def set_item_value(self, item, value):
item.setData(self.VALUE_ROLE, value)
def get_item_value(self, item):
return item.data(self.VALUE_ROLE)
def is_item_checked(self, item):
return item.checkState() == QtCore.Qt.Checked
def revert_original_value(self, item, boolean):
original_value = self.get_item_value(item)
if boolean:
self.set_item_checked(item, original_value)
else:
self.set_item_text(item, self.float_to_string(original_value))
def set_item_checked(self, item, checked):
if checked:
item.setCheckState(QtCore.Qt.Checked)
else:
item.setCheckState(QtCore.Qt.Unchecked)
def get_full_attr_name(self, row, item):
node_name = self.table_widget.item(row, 1).data(self.VALUE_ROLE)
return "{0}.{1}".format(node_name, self.get_item_attr(item))
def float_to_string(self, value):
return "{0:.4f}".format(value)
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()
QTableWidget
最新推荐文章于 2024-02-01 09:44:38 发布