PyQt5 QWebEngineView中从JavaScript调用Python函数时出现Uncaught ReferenceError: qt is not defined错误
PyQt5 QWebEngineView中从JavaScript调用Python函数时出现Uncaught ReferenceError: qt is not defined错误
嗨,我来帮你搞定这个问题!你遇到的Uncaught ReferenceError: qt is not defined错误,主要是两个地方出了问题:自定义WebEnginePage的初始化顺序错误,以及qwebchannel.js的加载路径可能存在兼容性问题。咱们一步步来修正:
问题1:WebChannel与自定义Page的绑定顺序错误
你当前的代码里,先给浏览器的默认Page设置了WebChannel,然后又替换成了自定义的WebEnginePage——这就导致新的Page根本没有绑定WebChannel,JS自然找不到qt对象。
修正后的MainWindow初始化代码:
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.browser = WebEngineView() # 第一步:先创建自定义Page并设置给浏览器 self.custom_page = WebEnginePage(self.browser) self.browser.setPage(self.custom_page) # 第二步:初始化WebChannel并绑定到自定义Page self.channel = QWebChannel() self.channel.registerObject('backend', self.browser) self.custom_page.setWebChannel(self.channel) url = QUrl.fromLocalFile(HTML_PATH) self.browser.load(url) central_widget = QWidget() layout = QVBoxLayout(central_widget) layout.addWidget(self.browser) self.setCentralWidget(central_widget)
问题2:qwebchannel.js的加载路径问题
通过qrc:///qtwebchannel/qwebchannel.js加载脚本在某些本地文件场景下可能会失败,建议你直接复制这个JS文件到本地目录:
- 找到你的PyQtWebEngine安装路径(比如
Lib/site-packages/PyQt5/Qt/resources/qtwebchannel/qwebchannel.js) - 把这个文件复制到和
page.html同一个文件夹里 - 修改HTML里的脚本引用为相对路径:
修正后的page.html脚本部分:
<script src="qwebchannel.js"></script>
可选优化:避免JS过早调用Python函数
为了防止用户在WebChannel初始化完成前点击按钮,你可以给JS加个就绪检查:
<script> var backend; var isBackendReady = false; new QWebChannel(qt.webChannelTransport, function (channel) { backend = channel.objects.backend; isBackendReady = true; console.log("Backend initialized successfully!"); }); function callPython(){ if (!isBackendReady) { console.log("Error: Backend not ready yet, please wait!"); return; } backend.foo(); } </script>
做完这些修改后,再运行程序点击按钮,应该就能正常调用Python的foo()函数,控制台也不会再出现qt is not defined的错误啦!
备注:内容来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

