Новая функция для предыдущего вопроса PySide2 QListView и QTableView - PullRequest
0 голосов
/ 22 января 2019

Предыдущий вопрос был this .

РЕДАКТИРОВАНИЕ ДЛЯ ПРЕДОСТАВЛЕНИЯ ИНФОРМАЦИИ:

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

dict_of_dicts={
'dict1':{'k1':'v1', 'k2':'v2', 'k3':'v3', 'EXISTING_DICT':'dict2'},
'dict2':{'k4':'v4'},
'dict3':{'k5':'v5', 'k6':'v6'},
}

, являющиеся qlistview:

*dict1
------
dict2
-----
dict3

и qtableview с dict1, выбранным в qlistview:

k1 | v1
-------
k2 | v2
-------
k3 | v3
-------
dict2

Есть ли способ сортировкимодель с сначала унаследованными диктами сверху, а затем элементами dict?

dict2
-------
k1 | v1
-------
k2 | v2
-------
k3 | v3

И если мы введем новые элементы на лету (у меня есть способ ввести новые элементы в интерфейс), он будет отсортированнезависимо от порядка?

Я играл с QStandardItemModel sort и setSortRole (Qt.CheckStateRole)

1 Ответ

0 голосов
/ 22 января 2019

Используя мой предыдущий ответ в качестве основы, необходимо использовать QSortFilterProxyModel, но мы должны использовать роль QtCore.Qt.UserRole + 1000, кроме того, мы должны изменить части, которые я укажу с помощью комментарий:

# ...

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        model = create_model_from_dict(dict_of_dicts, self)

        self.tableview = TableView()
        self.proxy_model = QtCore.QSortFilterProxyModel() # <---
        self.proxy_model.setSourceModel(model) # <---
        self.proxy_model.setSortRole(QtCore.Qt.UserRole + 1000) # <---
        self.proxy_model.sort(0, QtCore.Qt.AscendingOrder) # <---
        self.tableview.setModel(self.proxy_model) # <---
        self.tableview.leftDoubleClicked.connect(self.handleSelectionChangedTV)

        # ...

    @QtCore.Slot(QtCore.QItemSelection)
    def handleSelectionChangedLV(self, item):
        ixs = item.indexes()
        if ixs:
            pix = self.proxy_model.mapFromSource(ixs[0]) # <---
            self.tableview.setRootIndex(pix) # <---
            model = self.tableview.model()
            self.tableview.clearSpans()
            for r in range(model.rowCount(self.tableview.rootIndex())):
                index = model.index(r, 0, self.tableview.rootIndex())
                if index.data(QtCore.Qt.UserRole + 1000):
                    self.tableview.setSpan(r, 0, 1, 2)

# ...
...