Я использую Pyside2 с QML и стараюсь хорошо организовать мой код.Я хочу выставить подкласс MyModel
из QAbstractListModel
из Python в QML для использования в ListView
.Код работает отлично, если я объявляю экземпляр MyModel
непосредственно внутри движка:
...
engine = QQmlApplicationEngine()
myModel = MyModel(some_dict)
engine.rootContext().setContextProperty("myModel ", myModel)
...
, который я могу затем использовать так:
ListView {
model: myModel
delegate: Row {
Text { text: name }
Text { text: type }
}
}
Однако, когда я пытаюсь определить этоэлемент как Property
класса, чтобы держать вещи в чистоте и не регистрировать модели повсеместно, я не могу заставить его работать.Я не могу восстановить хорошую отладочную информацию из qml, что также не помогает.
Я попытался объявить следующее
class ModelProvider(QObject):
modelChanged = Signal()
_entries: List[Dict[str, Any]]
def __init__(self, entries, parent=None):
QObject.__init__(self, parent)
self._entries = entries
def _model(self):
return MyModel(self._entries)
myModel = Property(list, _model, notify=modelChanged)
myQVariantModel = Property('QVariantList', _model, notify=modelChanged)
...
modelProvider = ModelProvider(some_dict)
engine.rootContext().setContextProperty("modelProvider", modelProvider )
, а затем использовать его в qml
ListView {
model: modelProvider.myModel
// or model: modelProvider.myQVariantModel
delegate: Row {
Text { text: name }
Text { text: type }
}
}
Результатом является пустой экран.
Я обнаружил там , что одной из возможных причин может быть то, что QAbstractListModel
- это QObject
, что делает его не подлежащим копированию, ив С ++ вместо этого они предлагают передать указатель на него.Но я подумал, что это будет автоматически в Python.
Что я делаю не так в этом случае?И, если возможно, как я могу узнать, почему ListView
ничего не рендерит (может быть, отладочный вывод)?Разве вообще невозможно организовать мой код таким образом?
Для контекста я пытаюсь следовать шаблону Bloc , который мне очень нравится использовать с dart
и flutter
, в котором имеется один (или более) центральный класс Bloc
, который предоставляет модель и методы для работы с этой моделью для представления.