Ich versuche, eine QML-Ansicht mit einem QSortFilterProxyModel innerhalb PyQt5 zu kombinieren. Leider kann ich es in keiner Weise zur Arbeit bringen. Mein Hauptproblem scheint jetzt zu sein, die Artikel von QML zurückzugeben. Aber selbst wenn das möglich wäre, scheint es, dass es nicht funktioniert, ich bekomme TypeError: QSortFilterProxyModel.setSourceModel(QAbstractItemModel): argument 1 has unexpected type 'PyCapsule'
, wenn ich das Modell direkt in Python setze.Verwenden Sie ein QSortFilterProxyModel von QML mit PyQt5
Zur Zeit habe ich:
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()
und
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"
}
}
}
volle Quelle hier:
https://github.com/sturmf/python_samples/tree/master/pyqt_qsortfilterproxymodel
das Quellmodell eines QSortFilterProxyModel tun muss ein QAbstractItemModel sein, von denen QQmlListProperty und QQmlListReference stammen nicht von –