我在QML中使用Pyside2,并努力保持代码的良好组织。
我想从Python向QML公开QAbstractListModel
的子类MyModel
,以便在ListView
中使用。如果我直接在引擎内部声明MyModel
实例,那么代码可以完美地工作:
...
engine = QQmlApplicationEngine()
myModel = MyModel(some_dict)
engine.rootContext().setContextProperty("myModel ", myModel)
...
我可以这样使用:
^{pr2}$然而,当我试图将这个元素定义为一个类的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 }
}
}
结果是一个空白屏幕。在
我发现there一个潜在的原因可能是QAbstractListModel
是一个QObject
,这将使它不可复制,在c++中,他们建议传递一个指向它的指针。但我认为这在Python中是自动发生的。在
在这种情况下我做错了什么?如果可能的话,我如何找出ListView
没有呈现任何内容(也许是调试输出)?用这种方式组织代码是不可能的吗?在
对于上下文,我尝试遵循Bloc模式,我很喜欢与dart
和flutter
一起使用,其中有一个(或多个)中央Bloc
类,它们公开了模型以及在该模型上操作视图的方法。在
必须指出属性是一个QObject,而不是QVariantList或list。另一方面,我不认为你要改变模型,所以你应该使用常量属性,而不使用信号。另外,您不相信Model函数,因为每次调用\u Model时都会创建一个不同的对象。在
主.py
主.qml
^{pr2}$相关问题 更多 >
编程相关推荐