从python排序QAbstractListModel

2024-09-27 21:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python和qt的初学者。我需要按list的一个属性对python中创建的QAbstractList进行排序,我使用sorted()方法,但是当我运行代码时,python停止了工作.can美国救命。从Qml我调用了slot sortData()。sortData()函数不正确 我的代码是

模型2.py

from PyQt5.QtCore import QAbstractListModel, Qt, pyqtSignal, pyqtSlot
from PyQt5.QtCore import QSortFilterProxyModel

class PersonModel(QAbstractListModel):

    Name = Qt.UserRole + 1
    value1 = Qt.UserRole + 2
    value2 = Qt.UserRole + 3
    value3 = Qt.UserRole + 4
    value4 = Qt.UserRole + 5

    personChanged = pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.persons = [
            {'name': 'item1', 'value1': 10.66, 'value2':10.78, 'value3':10.94, 'value4':10.90},
            {'name': 'item1', 'value1': 10.56, 'value2':10.78, 'value3':10.34, 'value4':10.90},
            {'name': 'item2', 'value1': 10.66, 'value2':10.88, 'value3':10.44, 'value4':10.30}
        ]
        self.i=0
        print(self.persons)

    def data(self, QModelIndex, role):
        row = QModelIndex.row()
        if role == self.Name:
            return self.persons[row]['name']
        if role == self.value1:
            return self.persons[row]['value1']
        if role == self.value2:
            return self.persons[row]['value2']
        if role == self.value3:
            return self.persons[row]['value3']
        if role == self.value4:
            return self.persons[row]['value4']


    def rowCount(self, parent=None):
        return len(self.persons)

    def roleNames(self):
        return {
            Qt.UserRole + 1: b'name',
            Qt.UserRole + 2: b'value1',
            Qt.UserRole + 3: b'value2',
            Qt.UserRole + 4: b'value3',
            Qt.UserRole + 5: b'value4'
        }

    @pyqtSlot()
    def addData(self):
        self.beginResetModel()
        self.persons = self.persons.append({'name': 'peter', 'value1': 22, 'value2':30, 'value3':40, 'value4':50})
        self.endResetModel()
        print(self.persons)

    @pyqtSlot()
    def editData(self):
        print(self.model.persons)

    @pyqtSlot(int)
    def sortData(self):
        self.beginResetModel()
        self.persons = sorted(self.persons, key=lambda x: float(x[1]))
        sorted(self.persons)
        #sorted_x = sorted(self._persons, key=lambda role: self.value1)
        #print(sorted_x)
        #self.persons.sort(2, key=Qt.AscendingOrder)
        self.endResetModel()
        print(self.persons)

在你好.py在

^{pr2}$

我从Qml调用了slot sortData()。sortData()函数我认为是不正确的


Tags: nameselfreturndefqtrolerowsorted
1条回答
网友
1楼 · 发布于 2024-09-27 21:35:13

要对视图排序,最合适的选项是使用QSortProxyModel,但这只适用于Python端,如果要将该方法公开给QML,则必须进行一些修改,以便创建一个继承QSortProxyModel的类并添加该方法:

class SortProxyModel(QSortFilterProxyModel):
    @pyqtSlot(str, int)
    def sortData(self, roleName, order):
        if order == Qt.InitialSortOrderRole:
            self.setSortRole(order)
            self.invalidate()
        else:
            roles = [key for key, value in self.roleNames().items() if value == roleName.encode()]
            if len(roles) > 0:
                self.setSortRole(roles[0])
                self.sort(0, order)

然后你要做的是通过setSourceModel()将原始模型作为基础传递,这个新模型就是必须传递给qml的。在

^{pr2}$

在下面的link中有一个例子

相关问题 更多 >

    热门问题