从 QTreeview 选择 Pyside 返回顶部项目

问题描述 投票:0回答:1

我有一个 QTreeview,根据用户的选择,我想获得一个唯一的数组,其中包含所选项目的父项的所有名称。

因此,如果选择了任何子级,它将返回父级,如果选择了父级,它仍然会返回父级。

想要退货:

>> [Kevin, Michelle, Nikki, Tim]

from PySide import QtGui, QtCore
from PySide import QtSvg, QtXml
import sys

class Person:
    def __init__(self, name="", children=None):
        self.name = name
        self.children = children if children else []

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(300, 400)
        self.init_ui()

    def init_ui(self):
        # Setup Tabs Widget
        # self.treeview = QtGui.QTreeView()
        self.treeview = QtGui.QTreeView()
        self.treeview.setHeaderHidden(True)
        self.treeview.setUniformRowHeights(True)
        self.treeview.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.treeview.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)

        self.model = QtGui.QStandardItemModel()
        self.treeview.setModel(self.model)

        self.action = QtGui.QAction('Print', self)
        self.action.setShortcut('F5')
        self.action.triggered.connect(self.get_checked)

        fileMenu = QtGui.QMenu("&File", self)
        fileMenu.addAction(self.action)
        self.menuBar().addMenu(fileMenu)

        # Setup central widget
        self.setCentralWidget(self.treeview)

        # populate data
        self.populate_people()
        self.treeview.expandAll()

    def populate_people(self):
        parents = [
            Person("Kevin", [Person("Tom"), Person("Sarah"), Person("Chester")]),
            Person("Michelle", [Person("James"), Person("Corey"),Person("Leslie")]),
            Person("Doug", [Person("Fred"), Person("Harold"),Person("Stephen")]),
            Person("Nikki", [Person("Brody"), Person("Tyson"),Person("Bella")]),
            Person("Tim", [Person("Marie"), Person("Val"),Person("Ted")])
        ]

        for p in parents:
            self.create_nodes(p, self.model)

    def create_nodes(self, node, parent):
        tnode = QtGui.QStandardItem()
        tnode.setCheckable(True)
        tnode.setData(QtCore.Qt.Unchecked, role=QtCore.Qt.CheckStateRole)
        tnode.setData(node.name , role=QtCore.Qt.DisplayRole)
        tnode.setData(node, role=QtCore.Qt.UserRole) # store object on item

        parent.appendRow(tnode)

        for x in node.children:
            self.create_nodes(x, tnode)

    def get_checked(self):
        print "collecting parents..."


def main():
    app = QtGui.QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
python selection pyside qtreeview
1个回答
3
投票

这是一个简单的实现:

def selectedParents(self):
    parents = set()
    for index in self.treeview.selectedIndexes():
        while index.parent().isValid():
            index = index.parent()
        parents.add(index.sibling(index.row(), 0))
    return [index.data() for index in sorted(parents)]

请注意,

selectedIndexes()
按选择的顺序返回索引,并且如果有多列,将包括所选行中每列的索引。

因此,上述方法确保仅包含第一列中的文本,并确保项目以正确的顺序返回。

© www.soinside.com 2019 - 2024. All rights reserved.