You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件到本地目录:

  1. 找到你的PyQtWebEngine安装路径(比如Lib/site-packages/PyQt5/Qt/resources/qtwebchannel/qwebchannel.js)
  2. 把这个文件复制到和page.html同一个文件夹里
  3. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 11:13:06