我想要做的是:從模型中取出項目并使用排序代理按不同的角色對它們進行排序:預期輸出:實際輸出包含不應該存在的空行:您可以看到空行擴展了 ListView,甚至可以通過光標進行選擇。這是產生這種不正確行為的代碼:from PySide2.QtCore import *from PySide2.QtWidgets import *import sysimport stringimport randomclass MyItem: def __init__(self, name, value): self.name = name self.value = value def __str__(self): return self.name +" "+ str(self.value)class MyCustomModel(QAbstractListModel): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.list = [] def rowCount(self, parent=None): return len(self.list) def data(self, index, role): row = index.row() if row < 0 or row >= len(self.list): return None item = self.list[row] if role == Qt.DisplayRole: return str(item) if role == Qt.UserRole: return item.value else: return None def add(self, item): rc = self.rowCount() self.beginInsertRows(QModelIndex(), rc, rc+1) self.list.append(item) self.endInsertRows()class MyWidget(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.model = MyCustomModel() self.listView = QListView(self) self.sortingProxy = QSortFilterProxyModel() self.sortingProxy.setSourceModel(self.model) self.sortingProxy.setSortRole(Qt.UserRole) self.sortingProxy.sort(0, Qt.AscendingOrder) self.listView.setModel(self.sortingProxy) self.layout = QVBoxLayout(self) self.layout.addWidget(self.listView) self.setLayout(self.layout) self.show() # create some random data for the model for i in range(10): randomName = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(8)]) self.model.add(MyItem(randomName, random.randint(0, 30)))app = QApplication(sys.argv)widget = MyWidget()app.exec_()
1 回答

慕無忌1623718
TA貢獻1744條經驗 獲得超4個贊
問題不在于代理,問題是由您用于添加項目的方法引起的,如果您查看文檔,則必須將行號從添加位置傳遞到添加位置,在這種情況下,因為只添加了 1,則兩者匹配,在一般情況下如果添加n個元素,解決方案是:
rc = self.rowCount()
self.beginInsertRows(QModelIndex(), rc, rc + n - 1)
所以在你的情況下,解決方案是:
def add(self, item):
rc = self.rowCount()
self.beginInsertRows(QModelIndex(), rc, rc)
self.list.append(item)
self.endInsertRows()
添加回答
舉報
0/150
提交
取消