使用 PySide 为 PySide Widget 中的项目生成逗号分隔列表

49 阅读2分钟

如何使用 PySide 将 QTreeView 中的每个项目添加到逗号分隔列表中?例如: ['Workspaces/', 'Workspaces/0010', 'Video/']

以下是编写的用于生成文件夹目录的代码:

import sys
import os
from PySide import QtGui
from PySide.QtCore import *
from PySide.QtGui import *

class WorkSpaceUtility(QtGui.QWidget):

    def __init__(self):
        super(WorkSpaceUtility, self).__init__()

        self.initUI()

    def initUI(self):

        # Treelist View
        self.tvFolders = QtGui.QTreeWidget(self)
        self.tvFolders.setHeaderLabel('Folders')
        self.tvFolders.setSortingEnabled(True)
        self.tvFolders.resize(300,300)
        self.tvFolders.move(0,0)

        # Add TEMP folders for testing
        self.addItem('Audio', self.tvFolders.invisibleRootItem())
        item = self.addItem('Workspaces', self.tvFolders.invisibleRootItem())
        self.addItem('0010', item)
        vid = self.addItem('Video', self.tvFolders.invisibleRootItem())
        self.addItem('0020', vid)
        self.addItem('0010', vid)
        shot = self.addItem('0050', vid)
        self.addItem('0050_10', shot)
        asset = self.addItem('0050_20', shot)
        self.addItem('donuts', asset)
        self.addItem('0050_30', shot)
        self.addItem('0040', vid)

        # Print Treeview
        bnPrintInfo = QtGui.QPushButton('Print Info', self)
        bnPrintInfo.resize(280,40)
        bnPrintInfo.move(10, 310)       
        bnPrintInfo.clicked.connect(self.PrintInfo)

        self.resize(300, 360)
        self.center()

        self.setWindowTitle('Workspace Utility')  
        self.show()

    def PrintInfo(self):
        startNode = self.tvFolders.invisibleRootItem()
        lists = self.generateList(startNode)

        print lists

    def generateList(self, node, children=[], path=""):
        path = os.path.join(path, node.text(0))

        for i in xrange(node.childCount()):
            files = self.generateList(node.child(i), children, path)
        children.append(path)

        return children

    def center(self):

        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def addItem(self, name, parent):
        self.tvFolders.expandItem(parent) 
        item = QTreeWidgetItem(parent)
        item.setText(0, name)
        #It is important to set the Flag Qt.ItemIsEditable
        item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled | Qt.ItemIsEditable)

        item.setIcon(0,self.style().standardIcon(QStyle.SP_DirIcon))
        return item

def main():

    app = QtGui.QApplication(sys.argv)
    ex = WorkSpaceUtility()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这些是要获取并添加到逗号分隔列表中的目录:

['Workspaces/', 'Workspaces/0010', 'Video/']

2、解决方案

一种解决方案是使用递归函数来遍历树视图中的所有项目并将其添加到列表中。

这里有一个示例代码:

def PrintInfo(self):
    startNode = self.tvFolders.invisibleRootItem()
    lists = self.generateList(startNode)

    print lists

def generateList(self, node, children=[], path=""):
    path = os.path.join(path, node.text(0))

    for i in xrange(node.childCount()):
        files = self.generateList(node.child(i), children, path)
    children.append(path)

    return children

函数 generateList 接收一个节点作为参数,并返回一个包含该节点及其所有子节点的路径的列表。

函数首先将节点的文本添加到路径中,然后遍历节点的所有子节点并调用 generateList 函数来获取子节点的路径。

最后,将子节点的路径添加到列表中并返回列表。

调用 PrintInfo 函数将打印出树视图中所有项目的路径。