PySide:TreeView文件夹小部件

2024-05-15 02:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用PySide for Autodesk Maya创建一个TreeView小部件,它可以显示目录的内容,如下例所示:

Treeview example

我确实找到了一个使用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))

谁能帮帮我吗!在

编辑: 我确实在你们的帮助下解决了问题,谢谢大家:

^{pr2}$

但是有谁可以帮助设置QTreeView小部件的高度和宽度吗?在


Tags: nameinfromimportlayerforifitems
3条回答

QDirModel很棒。如果您需要其他解决方案,可以尝试以下方法:

class MyTree(QtWidgets.QTreeWidget):
    def __init__(self, parent=None):
        super(MyTree, self).__init__(parent=parent)
        self.startDir = "C:/daten/backup"
        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 = QtWidgets.QTreeWidgetItem(currentItem)
                    dirItem.setText(0, f)
                    iterate(path, dirItem)
                else:
                    fileItem = QtWidgets.QTreeWidgetItem(currentItem)
                    fileItem.setText(0, f)
        iterate(self.startDir, self)

它只是遍历一个起始目录,直到不再找到任何目录为止。在

你混合了maya和Qt控件,有什么原因吗?如果父窗口为none,qtwidges会自动创建一个窗口。一个很好的做法是将一个小部件子类化,使您能够将所有必需的数据保存在一个位置,如下所示:

class MyTree(QtWidgets.QTreeWidget):
    def __init__(self, parent=None):
        super(MyTree, self).__init__(parent)
        self.fillTree()

    def fillTree(self):
        self.clear()
        for i in range(10):
            item = QtWidgets.QTreeWidgetItem(self)
            item.setText(0, str(i))

然后你可以自动显示如果你添加自我展示()在self.fillTree公司()或从maya调用它:

^{pr2}$

此时会出现一个窗口。此窗口不会始终位于Maya窗口的顶部。如果需要,请导入mayaMixin并从mixin继承:

import maya.app.general.mayaMixin as MayaMixin

class MyTree(MayaMixin.MayaQWidgetBaseMixin, QtWidgets.QTreeWidget):
    .....

接下来,您可以开始用正确的数据填充树并添加子项。使用当前项作为父项可以简单地添加子项:

^{4}$

你需要整理你的数据!在你上次的评论中,你告诉我你不知道什么是你的数据,当你有了它,你可以循环使用它并用'while'或'for'将子元素添加到树中

我的文件夹={'parent1':{'Lips':['A','B','C']}}

下面这部分是要添加子项的循环:

items = []
for k in treepop:
    # this is "parent1"
    root_item = QTreeWidgetItem()
    root_item.setText(0,k)

    if treepop[k]:
        # if there is children to "parent1", add Lips children to parent1
        for v in treepop[k]:
            child_item = QTreeWidgetItem()
            child_item.setText(0,v)
            root_item.addChild(child_item)
        if treepop[k][v]:
            for sub in treepop[k][v]:

                sub_item = QTreeWidgetItem()
                sub_item.setText(0, sub)
                child_item.addChild(sub_item)

    items.append(root_item)
treeview.addTopLevelItems(items)

任何事情都有可能最复杂的事情是组织你的数据

请注意,如果您正在尝试制作一个浏览器,那么在qtirmodel中有一个东西是QDirModel: QTreeView Display Directoryhttps://doc.qt.io/qtforpython/PySide2/QtWidgets/QDirModel.html

^{pr2}$

相关问题 更多 >

    热门问题