【发布时间】:2020-03-09 02:45:13
【问题描述】:
我想使用 PySide for Autodesk Maya 创建一个 TreeView 小部件,它可以显示目录的内容,如下例所示:
我确实找到了一个使用 tkinter 的简单 python 脚本示例: Tkinter: Treeview widget。但我想使用 Pyside,以便在 Autodesk Maya 中运行它
我确实创建了一个可以显示简单 TreeView 小部件的脚本:
这是我的代码:
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2 import __version__
from shiboken2 import wrapInstance
import collections
import maya.OpenMayaUI as OpenMayaUI
except ImportError:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide import __version__
from shiboken import wrapInstance
import collections
import maya.OpenMayaUI as OpenMayaUI
treepop = collections.defaultdict(list)
treepop[""]=['layer_1',
'layer_2',
'layer_3',
'layer_4',
'layer_5',
'layer_6',
'layer_12']
treepop["layer_2"] = ['layer_7',
'layer_9',
'layer_11']
treepop["layer_3"] = ['layer_7']
treepop["layer_8"] = ['layer_10']
treepop["layer_10"] = ['layer_13']
def mayaToQT(name):
# Maya -> QWidget
ptr = OpenMayaUI.MQtUtil.findControl(name)
if ptr is None: ptr = OpenMayaUI.MQtUtil.findLayout(name)
if ptr is None: ptr = OpenMayaUI.MQtUtil.findMenuItem(name)
if ptr is not None: return wrapInstance(long(ptr),
QWidget)
cmds.window()
layout = cmds.columnLayout(rowSpacing=10, columnWidth=250)
qwidget= mayaToQT(layout)
qlayout = qwidget.children()[0]
treeview = QTreeWidget()
treeview.setSelectionMode(QAbstractItemView.ExtendedSelection)
treeview.setColumnCount(1)
treeview.setAlternatingRowColors(True)
treeview.clear()
qlayout.addWidget(treeview)
items = []
for k in treepop[""]:
root_item = QTreeWidgetItem()
root_item.setText(0,k)
print(k)
if k in treepop:
for v in treepop[k]:
child_item = QTreeWidgetItem()
child_item.setText(0,v)
root_item.addChild(child_item)
items.append(root_item)
treeview.addTopLevelItems(items)
cmds.showWindow()
def getSelected():
items = treeview.selectedItems()
for i in items:
print(i.text(0))
谁能帮帮我!
编辑: 我确实在您的帮助下解决了问题,谢谢大家:
try:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2 import __version__
from shiboken2 import wrapInstance
import collections
import maya.OpenMayaUI as OpenMayaUI
import os
except ImportError:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide import __version__
from shiboken import wrapInstance
import collections
import maya.OpenMayaUI as OpenMayaUI
import os
class MyTree(QTreeWidget):
def __init__(self, parent=None):
QTreeWidget.__init__(self, parent)
self.startDir = "C:/users/user/desktop/myFolder"
self.setHeaderLabels([self.startDir])
self.setColumnWidth(0,400)
self.setContentsMargins(0, 0, 0, 0)
self.header().setDefaultSectionSize(300)
self.header().setStretchLastSection(False)
self.header().setResizeMode(0, QHeaderView.ResizeToContents)
self.header().setResizeMode(0, QHeaderView.Stretch)
self.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.setColumnCount(1)
self.setAlternatingRowColors(True)
self.fillTree()
self.show()
def fillTree(self):
def iterate(currentDir, currentItem):
for f in os.listdir(currentDir):
path = os.path.join(currentDir, f)
if os.path.isdir(path):
dirItem = QTreeWidgetItem(currentItem)
dirItem.setText(0, f)
iterate(path, dirItem)
iterate(self.startDir, self)
def mayaToQT(name):
# Maya -> QWidget
ptr = OpenMayaUI.MQtUtil.findControl(name)
if ptr is None: ptr = OpenMayaUI.MQtUtil.findLayout(name)
if ptr is None: ptr = OpenMayaUI.MQtUtil.findMenuItem(name)
if ptr is not None: return wrapInstance(long(ptr),QWidget)
cmds.window(w=600, h=300)
layout = cmds.columnLayout(rowSpacing=60, columnWidth=400, w=600, h=600)
qwidget= mayaToQT(layout)
qlayout = qwidget.children()[0]
treeview = MyTree()
qlayout.addWidget(treeview)
cmds.showWindow()
但是任何人都可以帮助设置 QTreeView 小部件的高度和宽度吗?
【问题讨论】:
标签: python treeview maya directory-structure qtreewidget