亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

QSortFilterProxyModel 創建空白項目

QSortFilterProxyModel 創建空白項目

神不在的星期二 2021-11-23 20:13:30
我想要做的是:從模型中取出項目并使用排序代理按不同的角色對它們進行排序:預期輸出:實際輸出包含不應該存在的空行:您可以看到空行擴展了 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()


查看完整回答
反對 回復 2021-11-23
  • 1 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號