[英]return python dict to QML (PySide2)
I'm trying to find a way to return a python dictionary from a PySide2.QtCore.Slot.我试图找到一种从 PySide2.QtCore.Slot 返回 python 字典的方法。
main.py主文件
import sys
from PySide2.QtCore import QObject, Slot
from PySide2.QtGui import QGuiApplication, QQmlApplicationEngine
class Backend(QObject):
def __init__(self, parent=None):
return super().__init(parent)
@Slot(result=QObject)
def get_data(self):
data = {}
data["info1"] = "some information"
data["info2"] = "some more information"
data["info3"] = 42
return data
if __name__ == '__main':
BACKEND = Backend()
APP = QGuiApplication(sys.argv)
ENGINE = QQmlApplicationEngine(APP)
ENGINE.rootContext().setContextProperty('backend', BACKEND)
ENGINE.load("main.qml")
sys.exit(APP.exec_())
main.qml :主.qml :
import QtQuick 2.4
import QtQuick.Controls 1.4
ApplicationWindow {
id: root
width: 640
height: 480
visible: true
color: "#F0F0F0"
title: qsTr("Test")
Text {
anchors.centerIn: parent
text: backend.get_data()["info1"]
}
}
I think it is somehow done in QAbstractItemModel.roleNames() as it returns a QHash<int, QByteArray>
?我认为它在 QAbstractItemModel.roleNames() 中以某种方式完成,因为它返回QHash<int, QByteArray>
?
If it doesn't work like this, can anyone please support me with "the correct way" of exchanging inforamtion between the python backend and the QML frontend?如果它不能像这样工作,任何人都可以通过在python后端和QML前端之间交换信息的“正确方法”来支持我吗?
Thanks in advance :)提前致谢 :)
The basic types of python when they are exported to QML are converted to their corresponding type since they are supported, but for a Slot()
to return something the data type must be indicated through the result
parameter, in this QVariant
as a string. python 的基本类型在导出到 QML 时被转换为它们对应的类型,因为它们被支持,但是Slot()
返回某些数据,必须通过result
参数来指示数据类型,在这个QVariant
作为字符串。
main.py主文件
from PySide2 import QtCore, QtGui, QtQml
class Helper(QtCore.QObject):
@QtCore.Slot(result='QVariant')
def foo(self):
return {"a": 1, "b": 2}
if __name__ == '__main__':
import sys
app = QtGui.QGuiApplication(sys.argv)
engine = QtQml.QQmlApplicationEngine()
helper = Helper()
engine.rootContext().setContextProperty("helper", helper)
engine.load(QtCore.QUrl.fromLocalFile('main.qml'))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
main.qml主文件
import QtQuick 2.9
import QtQuick.Controls 2.4
ApplicationWindow {
visible: true
Component.onCompleted: {
var data = helper.foo()
for(var key in data){
var value = data[key]
console.log(key, ": ", value)
}
}
}
Output:输出:
qml: a : 1
qml: b : 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.