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

2024-09-29 13:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

var backend = null;
var x = 15;
new QWebChannel(qt.webChannelTransport, function (channel) {
    backend = channel.objects.backend;
    backend.getRef(x, function(pyval){
        backend.printRef(pyval)
    });
});
^{pr2}$

输出:

inside getRef 15
Could not convert argument QJsonValue(null) to target type int .

期望:

inside getRef 15
inside printRef 20

我不明白为什么返回的值是空的。如何将pyval存储到js端的变量中以便以后使用?在


Tags: 数据backend应用程序varjschannelfunctionnull
1条回答
网友
1楼 · 发布于 2024-09-29 13:27:51

C++中,这样一个方法可以返回一个值,它必须声明为^ {CD1>},而PyQt中的等价物是使用^ {CD2>}在^ {CD3>}装饰器:

├── index.html
└── main.py

主.py

^{pr2}$

索引.html

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>
        <script type="text/javascript">
            var backend = null;
            var x = 5;
            window.onload = function()
            {
                new QWebChannel(qt.webChannelTransport, function(channel) {
                    backend = channel.objects.backend;
                    backend.getRef(x, function(pyval) {
                        backend.printRef(pyval);
                    });
                });
            }
        </script>
    </head>
</html>

更新:

一般来说,QtWebChannel只能从Qt端传输可以转换成QJsonObject的信息,从javascript端传输可以转换成JSON的数据。在

所以有一些特殊情况:

  • int
  • 浮动
  • str
  • 列表:如果支持发送和接收列表,但是支持数字和字符串等元素,以及字典和其他支持前面基本类型的列表。在
class Backend(QtCore.QObject):
    @QtCore.pyqtSlot(result=list)
    def return_list(self):
        return [0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]

    @QtCore.pyqtSlot(list)
    def print_list(self, l):
        print(l)
backend = channel.objects.backend;
backend.return_list(function(pyval) {
    backend.print_list(pyval);
});

输出:

[0.0, 1.5, 'Hello', ['Stack', 5.0], {'a': {'b': 'c'}}]
  • dict
class Backend(QtCore.QObject):
    @QtCore.pyqtSlot(result="QJsonObject")
    def return_dict(self):
        return {"a": 1.5, "b": {"c": 2}, "d": [1, "3", "4"]}

    @QtCore.pyqtSlot("QJsonObject")
    def print_dict(self, ref):
        print(ref)
^{8}$

输出:

{'a': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50150>, 'b': <PyQt5.QtCore.QJsonValue object at 0x7f3841d501d0>, 'd': <PyQt5.QtCore.QJsonValue object at 0x7f3841d50250>}

如您所见,QJsonValue被返回,因此获取信息可能很麻烦,因此在这里,解决方法是将它们打包到一个列表中:

class Backend(QtCore.QObject):
    @QtCore.pyqtSlot(result=list)
    def return_list(self):
        d = {"a": 1.5, "b": {"c": 2}, "d": [1, "3", "4"]}
        return [d]

    @QtCore.pyqtSlot(list)
    def print_list(self, ref):
        d, *_ = ref
        print(d)
backend = channel.objects.backend;
backend.return_list(function(pyval) {
    backend.print_list(pyval);
});

输出:

{'a': 1.5, 'b': {'c': 2.0}, 'd': [1.0, '3', '4']}

相关问题 更多 >