由于您还没有提供role类,所以我假设它是一个qobject,如果不是,那么您必须修改您的类,以便qml无法识别它,此外qml中只识别信号、qproperty和slot。
另一方面,qmlregistertype只有在您想要在注册类的qml中创建对象时才是必需的,在您的情况下,我认为没有必要。
最后,如果要将列表传递给qml,则必须使用签名
'QVariantList'
(如果列表有效,则在pyqt中)。
from typing import List
from PySide2.QtCore import Property, QObject, QUrl, Signal, Slot
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import qmlRegisterType
from PySide2.QtQuick import QQuickView
class Role(QObject):
idChanged = Signal()
nameChanged = Signal()
def __init__(self, id_, name, parent=None):
super().__init__(parent)
self._id = id_
self._name = name
def get_id(self) -> int:
return self._id
def set_id(self, id_) -> None:
if self._id != id_:
self._id = id_
self.idChanged.emit()
def get_name(self) -> str:
return self._name
def set_name(self, name) -> None:
if self._name != name:
self._name = name
self.nameChanged.emit()
id_ = Property(int, fget=get_id, fset=set_id, notify=idChanged)
name = Property(str, fget=get_name, fset=set_name, notify=nameChanged)
class MockRoleService(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self.records = {
1: Role(id_=1, name="Admin", parent=self),
2: Role(id_=2, name="User", parent=self),
}
@Slot(result="QVariantList")
def find_all(self) -> List[Role]:
return list(self.records.values())
if __name__ == "__main__":
import os
import sys
app = QGuiApplication(sys.argv)
view = QQuickView()
current_dir = os.path.dirname(os.path.realpath(__file__))
url = QUrl.fromLocalFile(os.path.join(current_dir, "Views/main.qml"))
view.setSource(url)
view.setResizeMode(QQuickView.SizeRootObjectToView)
role_service = MockRoleService()
view.rootContext().setContextProperty("roleService", role_service)
if view.status() == QQuickView.Error:
sys.exit(-1)
view.show()
sys.exit(app.exec_())
import QtQuick 2.12
Item{
width: 640
height: 480
MouseArea {
anchors.fill: parent
onClicked: {
var roles = roleService.find_all()
console.log(roles)
for (var i in roles) {
var role = roles[i]
console.log(role.id_, role.name);
}
}
}
}
输出:
qml: [Role(0x55b5385589b0),Role(0x55b538558d40)]
qml: 1 Admin
qml: 2 User