上一个问题 PySide2 QListView 和 QTableView 的新功能

Posted

技术标签:

【中文标题】上一个问题 PySide2 QListView 和 QTableView 的新功能【英文标题】:New feature for previous question PySide2 QListView and QTableView 【发布时间】:2019-01-22 04:44:40 【问题描述】:

上一个问题是this。

编辑提供信息:

模型表示一个dict的dict,除了键值对之外,它们可以继承其他dict:

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

以及在qlistview中选择dict1的qtableview:

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

有没有办法对模型进行排序,首先是继承的字典,然后是字典元素?

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

如果我们在运行中引入新元素(我有办法在界面中引入新元素),无论顺序如何,它都会排序?

我在玩 QStandardItemModel 排序和 setSortRole(Qt.CheckStateRole)

【问题讨论】:

你可以用一个例子来解释,我混淆了你现在的解释 什么是inherited dicts on top 添加了新信息!!谢谢eyllanesc 【参考方案1】:

以我的previous answer为基础,必须使用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)

# ...

【讨论】:

太棒了!我什么都不懂(从一开始就没有得到角色的东西,现在是代理模型),但这太棒了!谢谢!! @eddy2k 使用def getFirstSibling(self) ixs = self.tableview.selectedIndexes() if ixs: model_index = ixs[0] sibling_ix = model_index.sibling(model_index.row(), 1) return sibling_ix.data() @eddy2k 请记住,QTableView 模型不再是 QStandardItemModel 而是 QSortFilterProxyModel 所以后者不再有 itemFromIndex 方法,所以与其走很长的路来获取 QStandardItem 你可以通过使用方法数据的 QModelIndex。阅读doc.qt.io/qt-5/qabstractproxymodel.html 真的很有用!谢谢!! 您能帮我解决这个问题吗? ***.com/questions/54262785/…

以上是关于上一个问题 PySide2 QListView 和 QTableView 的新功能的主要内容,如果未能解决你的问题,请参考以下文章

PySide2 QListView QTableView 同步问题

在带有 QSqlQueryModel 的 QListView 上使用 QStyledItemDelegate

QListView 更新 - 不触发更新

PySide2 在设计师创建的小部件上绘制

PySide2:如何使装饰槽在其工作线程上执行?

使用 QStyledItemDelegate::paint() 直接在 QListView 上绘制小部件