为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信