我是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()函数我认为是不正确的
要对视图排序,最合适的选项是使用QSortProxyModel,但这只适用于Python端,如果要将该方法公开给QML,则必须进行一些修改,以便创建一个继承QSortProxyModel的类并添加该方法:
然后你要做的是通过
^{pr2}$setSourceModel()
将原始模型作为基础传递,这个新模型就是必须传递给qml的。在在下面的link中有一个例子
相关问题 更多 >
编程相关推荐