【问题标题】:return python dict to QML (PySide2)将python dict返回到QML(PySide2)
【发布时间】:2019-03-07 09:40:32
【问题描述】:

我正在尝试找到一种从 PySide2.QtCore.Slot 返回 python 字典的方法。

ma​​in.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_())

ma​​in.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"]
 }
} 

我认为它以某种方式在 QAbstractItemModel.roleNames() 中完成,因为它返回 QHash<int, QByteArray>?

如果它不能这样工作,任何人都可以支持我在 python 后端和 QML 前端之间交换信息的“正确方法”吗?

提前致谢:)

【问题讨论】:

    标签: python qml pyside2


    【解决方案1】:

    python 的基本类型在导出到 QML 时会转换为相应的类型,因为它们受支持,但是对于 Slot() 要返回的内容,必须通过 result 参数指示数据类型,在此 @ 987654323@ 作为字符串。

    示例:

    ma​​in.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_())
    

    ma​​in.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)
            }
        }
    }
    

    输出:

    qml: a :  1
    qml: b :  2
    

    【讨论】:

    • 谢谢,这就像预期的那样工作! :) 你能告诉我找到这些信息吗?
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多