当用户单击刷新按钮以重新创建模型时,如何存储然后恢复展开的项目。 我想递归存储用户选择和所有扩展项,然后填充模型,最后恢复扩展项和所选项。

我已经弄清楚了如何还原选择,但是我不确定如何存储/还原扩展项。 可以使用qstandardItemModel's match功能来完成此操作吗?

是否有可能改善所选项目的还原,以免每次我选择该项目时都不会触发选择更改。 我想一次选择它们。

在此处输入图片说明

from PySide import QtGui, QtCore 


class Main(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(300,500)

        self.button = QtGui.QPushButton('Refresh')

        self.model = QtGui.QStandardItemModel()
        self.proxy = QtGui.QSortFilterProxyModel()
        self.proxy.setSourceModel(self.model)

        self.treeview = QtGui.QTreeView()
        self.treeview.setModel(self.proxy)
        self.treeview.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.treeview.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)

        self.selectionModel = self.treeview.selectionModel()

        self.layout = QtGui.QVBoxLayout()
        self.layout.addWidget(self.button)
        self.layout.addWidget(self.treeview)
        self.setLayout(self.layout)

        self.button.clicked.connect(self.populate)

        # begin
        self.populate()
        self.treeview.expandAll()


    def fill_model_from_json(self, parent, d):
        if isinstance(d, dict):
            for k, v in d.items():
                child = QtGui.QStandardItem(str(k)) 
                parent.appendRow(child)
                self.fill_model_from_json(child, v)
        elif isinstance(d, list):
            for v in d:
                self.fill_model_from_json(parent, v)
        else:
            parent.appendRow(QtGui.QStandardItem(str(d)))


    def populate(self):
        # Store User Selection
        names = [x.data() for x in self.selectionModel.selectedRows()]
        self.selectionModel.clearSelection()

        # Store Expanded Items

        # Populate
        self.model.clear()
        self.model.setHorizontalHeaderLabels(['Name'])

        items = {
            'Pasta': {
                'Spaghetti': {
                    'Thick': {},
                    'Thin': {}
                },
                'Ravioli': {
                    'Mushroom': {},
                    'Plain': {},
                },
            },
            'Cookies': {
                'Chocolate': {
                    'Dark Chocolate': {},
                    'Milk Chocolate': {}
                },
                'Misc': {
                    'M&M\'s': {},
                    'Snickerdoodle': {},
                },
            },
            'Hummus': {
                'Plain': {},
                'Spicy': {},
                'Mild': {}
            }
        }
        self.fill_model_from_json(self.model.invisibleRootItem(), items)

        # Restore User Selection
        indexes = []
        for x in names:
            results = self.model.match(self.model.index(0, 0), QtCore.Qt.DisplayRole, x, -1, QtCore.Qt.MatchRecursive)
            indexes.extend(results)

        for x in indexes:
            idx = self.proxy.mapFromSource(x)
            self.selectionModel.select(idx, QtGui.QItemSelectionModel.Select |  QtGui.QItemSelectionModel.Rows)

        # Restore Expanded Items


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())

  ask by JokerMartini translate from so

本文未有回复,本站智能推荐:

1回复

从QTreeview选择Pyside返回顶级项目

我有一个QTreeview,根据用户的选择,我想得到一个包含所选项目的所有父项名称的唯一数组。 因此,如果选择了任何子代,它将返回父代,如果选择了父代,它将仍然返回父代。 想要退货:
1回复

递归收集QTreeview中的所有项目

我如何收集所有Qtreeview项目,以便随后对其进行迭代并应用必要的更改,例如显示文本更新或颜色更改? 有没有一种简单的方法可以使用“匹配”方法收集所有数据? 测试代码:
1回复

从QTreeView中的索引列表设置选择

在PySide中,有没有一种方法可以选择几百个树状视图项目,而不必手动逐行选择它们? 此方法的问题是,每次选择新行时,UI都会更新,从而导致应用程序在完成该方法时冻结。 有没有一种方法可以让选择模型传递我要选择的所有行的列表? 我的树视图有数百行和四列,但是树视图设置为选择整个行,而不是
1回复

无法使用QFileSystems在QTreeView中编辑项目

我正在尝试获取QTreeView,以允许用户编辑QFileSystemModel中的文件名。 但是Qt只是打印: 使用PySide和PyQt可以得到相同的结果。 使用openPersistenEditor()打开编辑器是可行的,但是我更喜欢使用内置机制。
2回复

如何启用/禁用QTreeView事件中的项目?

我想在发送特定信号时启用/禁用QTreeWidget中的可检查项。 以下代码无效: 它产生错误: 是否有通过信号/插槽更改QStandardItem的状态或数据的解决方案?
1回复

向QTreeView/QFileSystemModel中的项目添加附加信息

我想根据存储在数据库中的许多属性以及项目是文件夹还是文件,以不同的方式呈现 QTreeView 中的每个项目。 但是,我不明白 QTreeView 或 QFileSystemModel 如何与委托进行通信。 每当必须绘制项目时,包括在初始化期间,我希望为委托提供它所需的所有参数,然后在委托中使用一系
1回复

qtreeview测试项目是否可检查

如何在python / pyside的QTreeview中测试项目是否可检查?
1回复

在QTreeView中停用树项

使用QWidgetItem时,可以使用以下函数:setDisabled(),使树项变灰。 我正在努力找出如何在QTreeView和QAbstractItemModel的上下文中执行此操作? 我已经看过所有的qt.ItemDataRoles,但是没有一个作为禁用项目的对象。 谢谢你的帮