如何在PyQT 5.7中从JavaScript访问Python代码?

时间:2016-09-17 07:27:02

标签: javascript python qt pyqt

我曾经通过附加一个对象

来做到这一点
self.page().mainFrame().addToJavaScriptWindowObject("js_interface", self.jsi)

在5.7我做:

self.page().setWebChannel(self.jsi)

但是当我尝试访问公开的函数时,我理解得到了一个JavaScript错误:

js: Uncaught ReferenceError: js_interface is not defined

谷歌搜索我发现我应该使用qwebchannel.js,但是我无法找到关于如何在任何地方使用它的文件或说明(有一些信息,但仅在安装QT时提供的一些示例中,而不是PyQt的)。

3 个答案:

答案 0 :(得分:11)

您可以使用脚本标记将 qwebchannel.js 添加到html页面中:

<script src="qrc:///qtwebchannel/qwebchannel.js"></script>

然后,在python端创建一个Web频道:

from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView

class CallHandler(QObject):
    @pyqtSlot()
    def test(self):
        print('call received')

view = QWebEngineView()
channel = QWebChannel()
handler = CallHandler()
channel.registerObject('handler', handler)
view.page().setWebChannel(channel)

与网络渠道互动的JS代码:

new QWebChannel(qt.webChannelTransport, function (channel) {
    window.handler = channel.objects.handler;
    window.handler.test();
});

答案 1 :(得分:1)

看看this page。它包含一个有用的示例(在c ++中,但很容易翻译成python)。

首先,您必须使用websocket从html与您的应用程序进行通信,反之亦然。

然后你可以设置你的QWebChannel。

答案 2 :(得分:0)

我认为这是一个很大的缺点,JS无法在PyQT5.9 +中直接与Python进行通信,就像以前一样使用&#34; addToJavaScriptWindowObject&#34;命令。 并使用websockets ...如果防火墙很重并且所有端口都被阻止了。

我想我将依赖简单的回调(从Python到JS检查更改/命令的长池类型)方法,并且没有QTWebChannel用法。