我曾经通过附加一个对象
来做到这一点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的)。
答案 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用法。