QTableWidget

24 篇文章 1 订阅

在这里插入图片描述

# -*- 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()


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值