上一题PySide2 QListView和QTableView的新特性
New feature for previous question PySide2 QListView and QTableView
上一题是。
编辑以提供信息:
该模型代表一个字典的字典,除了键值对之外,它们可以继承其他字典:
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)
以我的为基础,需要使用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)
# ...
上一题是
编辑以提供信息:
该模型代表一个字典的字典,除了键值对之外,它们可以继承其他字典:
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)
以我的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)
# ...