Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 上一个问题PySide2 QListView和QTableView的新功能_Python_Qtableview_Pyside2_Qstandarditemmodel - Fatal编程技术网

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

Python 上一个问题PySide2 QListView和QTableView的新功能,python,qtableview,pyside2,qstandarditemmodel,Python,Qtableview,Pyside2,Qstandarditemmodel,前一个问题是 编辑以提供信息: 该模型表示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 k1 | v1 ----

前一个问题是

编辑以提供信息:

该模型表示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
k1 | v1
-------
k2 | v2
-------
k3 | v3
-------
dict2
以及在qlistview中选择dict1的qtableview:

*dict1
------
dict2
-----
dict3
k1 | v1
-------
k2 | v2
-------
k3 | v3
-------
dict2
有没有一种方法可以先对继承的dict进行排序,然后再对dict元素进行排序

dict2
-------
k1 | v1
-------
k2 | v2
-------
k3 | v3
如果我们在运行中引入新元素(我有办法在界面中引入新元素),那么无论顺序如何,它都会被排序

我正在使用QStandardItemModel sort和setSortRole(Qt.CheckStateRole)

以my为基础,有必要使用
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)

# ...
#。。。
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
model=从dict(dict of dict,self)创建模型
self.tableview=tableview()

self.proxy_model=QtCore.QSortFilterProxyModel()#您可以用一个例子来解释,我混淆了您当前的解释顶部的继承dict是什么?添加了新信息!!谢谢你,真是太棒了!!我什么都不懂(从一开始就没有得到角色的东西,现在是proxymodel),但这太神奇了!!谢谢@eddy2k使用
def getFirstSibling(self)ixs=self.tableview.SelectedIndex()如果ixs:model_index=ixs[0]sibling_ix=model_index.sibling(model_index.row(),1)返回sibling_ix.data()
@eddy2k请记住,QTableView模型不再是QStandardItemModel,而是QSortFilterProxyModel,因此后者不再具有itemFromIndex方法,因此,您可以使用方法数据通过QModelIndex访问文本,而不必费尽心机获取QStandardItem。阅读真的很有用!谢谢先生,你能帮我拿这个吗?