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

zam*_*rov 2 javascript python qt pyqt

我曾经通过附加一个对象来做到这一点

self.page().mainFrame().addToJavaScriptWindowObject("js_interface", self.jsi)
Run Code Online (Sandbox Code Playgroud)

在5.7我做:

self.page().setWebChannel(self.jsi)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试访问公开的函数时,我理解为可以获得JavaScript错误:

js: Uncaught ReferenceError: js_interface is not defined
Run Code Online (Sandbox Code Playgroud)

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

xuh*_*hcc 11

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

<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
Run Code Online (Sandbox Code Playgroud)

然后,在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)
Run Code Online (Sandbox Code Playgroud)

与Web渠道交互的JS代码:

new QWebChannel(qt.webChannelTransport, function (channel) {
    window.handler = channel.objects.handler;
    window.handler.test();
});
Run Code Online (Sandbox Code Playgroud)

  • 另外:请确保`channel`,`handler`等不是垃圾回收.我正在用类方法初始化它们,我无法弄清楚为什么它不起作用甚至是segfaulted.诀窍是在类中保持对`channel`和`handler`的引用(例如`self.handler = CallHandler()`等 (4认同)