Восстановите пользовательский выбор и расширенные элементы в QTreeView - PullRequest
0 голосов
/ 19 сентября 2019

Как сохранить, а затем восстановить расширенные элементы, когда пользователи нажимают кнопку обновления, которая воссоздает модель.Я хочу рекурсивно сохранить выбор пользователей и все расширенные элементы, затем заполнить модель и, наконец, восстановить расширенные элементы и выбранные.

Мне удалось выяснить, как восстановить выделение, однако я не уверен, как сохранить / восстановить расширенные элементы.Можно ли это сделать с помощью функции qstandardItemModel's match?

Можно ли улучшить восстановление выбранных элементов, чтобы оно не вызывало изменение выбора каждый раз, когда я выбираю элемент.Я хотел бы выбрать их все сразу.

enter image description here

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_())
...