如何使用信号将python字典发送到QML接口?
我想将包含动态创建qml对象所需数据的字典从PySide2类发送到qml接口,因为我需要响应某些事件,所以我需要使用信号和插槽 因为我刚刚开始使用QML和python,所以我尝试创建一个简单的项目,只是为了玩(从代码中可以看到) QML: Python 3:如何使用信号将python字典发送到QML接口?,python,qml,pyside2,qt-signals,qt-slot,Python,Qml,Pyside2,Qt Signals,Qt Slot,我想将包含动态创建qml对象所需数据的字典从PySide2类发送到qml接口,因为我需要响应某些事件,所以我需要使用信号和插槽 因为我刚刚开始使用QML和python,所以我尝试创建一个简单的项目,只是为了玩(从代码中可以看到) QML: Python 3: #!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import os from time import sleep from PySide2.QtCore import Q
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
from time import sleep
from PySide2.QtCore import Qt, QObject, Signal, Slot, Property, QThread
from PySide2.QtWidgets import QApplication
from PySide2.QtQml import QQmlApplicationEngine
class Test1(QObject):
theSignal = Signal(dict)
def __init__(self):
QObject.__init__(self)
@Slot(int)
def catchInt(self,caught):
print("Caught: {0}".format(caught))
testDict = {"myAnswer":caught}
self.theSignal.emit(testDict)
if __name__ == "__main__":
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
stuff1 = {"text":"Trying"}
stuff2 = {"text":"To send"}
stuff3 = {"text":"Dict"}
ctx = engine.rootContext()
ctxVar = Test1()
ctx.setContextProperty("stuff1", stuff1)
ctx.setContextProperty("stuff2", stuff2)
ctx.setContextProperty("stuff3", stuff3)
ctx.setContextProperty("TestVar",ctxVar)
engine.load('main.qml')
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
我期望的结果(使用“python3 Test\u dict\u 1.py”启动脚本)是:
我得到的是:
Caught: 1
qml: undefined.
Caught: 2
qml: undefined.
Caught: 1
qml: undefined.
...etc...
你能告诉我我做错了什么吗?代码中是否有错误或无法执行此操作?您必须在信号中使用的签名是
QVariant
:
class Test1(QObject):
theSignal = Signal('QVariant')
@Slot(int)
def catchInt(self,caught):
print("Caught: {0}".format(caught))
testDict = {"myAnswer":caught}
self.theSignal.emit(testDict)
Caught: 1
qml: undefined.
Caught: 2
qml: undefined.
Caught: 1
qml: undefined.
...etc...
class Test1(QObject):
theSignal = Signal('QVariant')
@Slot(int)
def catchInt(self,caught):
print("Caught: {0}".format(caught))
testDict = {"myAnswer":caught}
self.theSignal.emit(testDict)