Javascript 如何使用QWebChannel从python接收数据到js?

Javascript 如何使用QWebChannel从python接收数据到js?,javascript,python,pyqt,pyqt5,qtwebchannel,Javascript,Python,Pyqt,Pyqt5,Qtwebchannel,我试图让我的PyQt应用程序与JS通信,但无法从python获取值。python端有两个插槽用于获取和打印数据。在这个示例中,一个int从JS传递到python,python向其添加5并将其传递回,然后JS调用另一个slot来打印新值 var-backend=null; var x=15; 新的QWebChannel Qt.WebChannel传输,功能频道{ 后端=channel.objects.backend; backend.getRefx,functionpyval{ backend.p

我试图让我的PyQt应用程序与JS通信,但无法从python获取值。python端有两个插槽用于获取和打印数据。在这个示例中,一个int从JS传递到python,python向其添加5并将其传递回,然后JS调用另一个slot来打印新值

var-backend=null; var x=15; 新的QWebChannel Qt.WebChannel传输,功能频道{ 后端=channel.objects.backend; backend.getRefx,functionpyval{ backend.printRefpyval }; }; @pyqtSlotint def getRefself,x: 打印“内部getRef”,x 返回x+5 @pyqtSlotint def printRefself,ref: 打印“内部打印参考”,参考 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
预期:

inside getRef 15
inside printRef 20

我不明白为什么返回值为null。在C++中,如何将该PyValf存储到JS端的变量中?< /p> < P> C++中,这样一个方法可以返回一个值,它必须声明为QyNojkabl,而PyQt中的等价物是使用@ PyQTStLoo装饰:/P>
├── index.html
└── main.py
main.py

后端=channel.objects.backend; backend.return\u listfunctionpyval{ backend.print_listpyval; }; 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
格言: 类BackendQtCore.QObject: @QtCore.pyqtSlotresult=QJsonObject def返回_dictself: 返回{a:1.5,b:{c:2},d:[1,3,4]} @QtCore.pyqtslotqsjsonObject def打印自身,参考: printref 后端=channel.objects.backend; backend.return\u dictfunctionpyval{ backend.print_dictpyval; }; 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
后端=channel.objects.backend; backend.return\u listfunctionpyval{ backend.print_listpyval; }; 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
更新2:

传输信息的一般方式是使用JSON,即分别使用JSON.dumps和JSON.stringify转换python或js对象并将其转换为字符串,然后发送;在python或js中收到字符串时,必须分别使用json.loads和json.parse进行转换:

类BackendQtCore.QObject: @QtCore.pyqtSlotstr,结果=str def getRefself,o: 打印内部getRef,o py_obj=json.loadso py_obj[c]=你好,来自Python 返回json.dumpspy_obj @QtCore.pyqtSlotstr def printRefself,o: py_obj=json.loadso PrintInner printRef,py_obj var-backend=null; window.onload=函数 { 新的QWebChannel Qt.WebChannel传输,functionchannel{ 后端=channel.objects.backend; var x={a:1000,b:[你好,From,JS]} backend.getRefJSON.stringifyx,functiony{ js_obj=JSON.parsey; js_obj[f]=假; backend.printRefJSON.stringifyjs_obj; }; }; }
在C++中,这样一个方法可以返回一个值,它必须声明为qyNojkabl,而PyQt中的等价物是使用@ PyQTStLoo装饰:/P>>中的结果。
├── index.html
└── main.py
main.py

后端=channel.objects.backend; backend.return\u listfunctionpyval{ backend.print_listpyval; }; 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
格言: 类BackendQtCore.QObject: @QtCore.pyqtSlotresult=QJsonObject def返回_dictself: 返回{a:1.5,b:{c:2},d:[1,3,4]} @QtCore.pyqtslotqsjsonObject def打印自身,参考: printref 后端=channel.objects.backend; backend.return\u dictfunctionpyval{ backend.print_dictpyval; }; 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
后端=channel.objects.backend; backend.return\u listfunctionpyval{ backend.print_listpyval; }; 输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .
[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}
{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}
更新2:

传输信息的一般方式是使用JSON,即分别使用JSON.dumps和JSON.stringify转换python或js对象并将其转换为字符串,然后发送;在python或js中收到字符串时,必须分别使用json.loads和json.parse进行转换:

类BackendQtCore.QObject: @QtCore.pyqtSlotstr,结果=str def getRefself,o: 打印内部getRef,o py_obj=json.loadso py_obj[c]=你好,来自Python 返回json.dumpspy_obj @QtCore.pyqtSlotstr def printRefself,o: py_obj=json.loadso PrintInner printRef,py_obj var-backend=null; window.onload=函数 { 新的QWebChannel Qt.WebChannel传输,functionchannel{ 后端=channel.objects.backend; var x={a:1000,b:[你好,From,JS]} backend.getRefJSON.stringifyx,functiony{ js_obj=JSON.parsey; js_obj[f]=假; backend.printRefJSON.stringifyjs_obj; }; }; }
def printRef没有返回任何内容。没有任何应该从printRef传回的数据。它只打印从getRef接收的值。问题是getRef没有正确地将值x+5返回到JS,因此printRef.def PrintRefisn可以打印它,而不返回任何内容。没有任何应该从printRef传回的数据。它只打印从getRef接收的值。问题是getRef没有正确地将值x+5返回到JS,这样printRef就可以打印它了。是这样吗
还有dict和list结构?@eyllanesc不确定这个问题是否超出了这里的范围,但我仍然可以问它。。。如何从python->js发送字典?如果我有sendDict=pyqtSignaldict,然后我做talkie.sendDict.emit{a:10},我会在js端得到null。另一方面,在处理简单类型(如int、float、str、bool)时,列出js端的值是否正常接收。。。只有在处理数据类型(如列表、集合、元组、对象等)时遇到问题,@BPL我添加了一个更通用的方法,该方法通常允许发送任何可以转换为JSON的对象。@eyllanesc Hehe,酷,当我在几个小时前问你同样的问题时,我得出了与你类似的结论,当时我担心编码/解码的可能开销。。。我已经用了一段时间了,看起来已经足够好了。也就是说,非常感谢您确认这是发送这些数据类型的惯用方法。。。我已经超过你了;dict和list结构也是这样吗?@eyllanesc不确定这个问题是否超出了这里的范围,但我仍然可以问它。。。如何从python->js发送字典?如果我有sendDict=pyqtSignaldict,然后我做talkie.sendDict.emit{a:10},我会在js端得到null。另一方面,在处理简单类型(如int、float、str、bool)时,列出js端的值是否正常接收。。。只有在处理数据类型(如列表、集合、元组、对象等)时遇到问题,@BPL我添加了一个更通用的方法,该方法通常允许发送任何可以转换为JSON的对象。@eyllanesc Hehe,酷,当我在几个小时前问你同样的问题时,我得出了与你类似的结论,当时我担心编码/解码的可能开销。。。我已经用了一段时间了,看起来已经足够好了。也就是说,非常感谢您确认这是发送这些数据类型的惯用方法。。。我已经超过你了;