猿问

QSortFilterProxyModel 创建空白项目

我想要做的是:从模型中取出项目并使用排序代理按不同的角色对它们进行排序:预期输出:

实际输出包含不应该存在的空行:

http://img2.mukewang.com/619cdb07000162a102760364.jpg

您可以看到空行扩展了 ListView,甚至可以通过光标进行选择。


这是产生这种不正确行为的代码:


from PySide2.QtCore import *

from PySide2.QtWidgets import *

import sys

import string

import random


class 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_()


神不在的星期二
浏览 182回答 1
1回答

慕无忌1623718

问题不在于代理,问题是由您用于添加项目的方法引起的,如果您查看文档,则必须将行号从添加位置传递到添加位置,在这种情况下,因为只添加了 1,则两者匹配,在一般情况下如果添加n个元素,解决方案是:rc = self.rowCount()self.beginInsertRows(QModelIndex(), rc, rc + n - 1)所以在你的情况下,解决方案是:def add(self, item):&nbsp; &nbsp; rc = self.rowCount()&nbsp; &nbsp; self.beginInsertRows(QModelIndex(), rc, rc)&nbsp; &nbsp; self.list.append(item)&nbsp; &nbsp; self.endInsertRows()
随时随地看视频慕课网APP

相关分类

Python
我要回答