我嘗試在PyQt5中將QML視圖與QSortFilterProxyModel結合起來。不幸的是,我無法以任何方式讓它工作。 我現在的主要問題似乎是將項目從QML傳回。但即使這可能,它似乎不起作用,我得到TypeError: QSortFilterProxyModel.setSourceModel(QAbstractItemModel): argument 1 has unexpected type 'PyCapsule'
,如果我直接在python中設置模型。在PyQt5中使用QML中的QSortFilterProxyModel
目前我有:
class SortFilterProxyModel(QSortFilterProxyModel):
@pyqtProperty(QQmlListReference)
def source (self):
return self._source
@source.setter
def source (self, source):
setSourceModel(source)
self._source = source
class MyItem(QObject):
nameChanged = pyqtSignal()
def __init__(self, name, parent=None):
QObject.__init__(self, parent)
self._name = name
@pyqtProperty('QString', notify=nameChanged)
def name(self):
return self._name
class MyModel(QObject):
itemsChanged = pyqtSignal()
def __init__(self, parent=None):
QObject.__init__(self, parent)
self._items = [MyItem('one'), MyItem('two'), MyItem('three')]
@pyqtProperty(QQmlListProperty, notify=itemsChanged)
def items(self):
print('Query for items')
return QQmlListProperty(MyItem, self, self._items)
@pyqtSlot()
def new_item(self):
print('Append new item')
self._items.append(MyItem('new'))
self.itemsChanged.emit()
和
import QtQuick 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.2
import MyModel 1.0
import MyItem 1.0
import SortFilterProxyModel 1.0
ApplicationWindow {
function getCurrentIndex(list, element) {
console.log('getCurrentIndex')
if (list && element) {
for (var i = 0; i < list.length; i++) {
if (list[i].name === element.name) {
console.log('Found item at pos: ' + i)
return i
}
}
}
return -1
}
id: mainWindow
width: 800; height: 600
color: "gray"
MyModel {
id: mymodel
}
SortFilterProxyModel {
id: proxyModel
source: mymodel.items
}
TableView {
anchors.fill: parent
//model: mymodel.items
model: proxyModel
TableViewColumn {
role: "name"
title: "Name"
}
}
}
完整的源代碼在這裏:
https://github.com/sturmf/python_samples/tree/master/pyqt_qsortfilterproxymodel
以下一個QSortFilterProxyModel的源模型必須是一個化QAbstractItemModel,其中QQmlListProperty和QQmlListReference不是派生自 –