解决QWebEngineView读取本地html文件卡顿的BUG

本文解决了一个使用PyQt5的QWebEngineView加载本地HTML文件时遇到的卡顿问题。当尝试加载第二个HTML文件时,即使调用了stop方法和load方法,浏览器仍会卡顿。通过分析,发现是本地HTML的JS加载错误导致的。最终解决方案是先调用stop方法,然后读取要打开的HTML文件内容,使用setHtml方法直接设置,避免了卡顿问题。
部署运行你感兴趣的模型镜像

环境

  • python3.6.8
  • PyQt5 5.12.2
  • win10 64位

情景:

目前用PyQt5的QWebEngineView做了一个文件管理预览功能,目前有一个问题,当我用load方法加载了一个本地的html文件,然后当我想去用这个browser去打开另一个html文件时

  • 先调用browser的stop方法
  • 然后调用load方法

然后卡顿产生了

思路

loadProgress信号绑定函数实时显示加载进度的时候,进度一直不能到100%,只有加载html文件时会卡顿,加载图片文件时没有任何卡顿,估计是由于本地html的js加载时报错误的原因,导致browser一直加载,无法完成。
于是一番百度后,也没查到什么,google之后发现国外友人也遇到了这个问题,也没有人解决。

采用了以下几种方法尝试终究是失败

  • 设定一个timer计时器,browser开始加载时 loadStarted信号绑定函数启动计时器,然后计时器事件到了之后发送timeout信号,调用browser的stop方法,没卵用
  • 每次加载新文件之前销毁browser,手动回收 del browser,然后重新创建一个browser,然后加载新文件,然后依然卡顿

解决方法

于是使用了第三种方法,估计时性能最慢的方法吧,但是解决问题了,

  • 先调用browser的stop方法
  • 读取要打开的文件,内容为html
  • 调用browser的setHtml方法,,将读取到的内容传给这个方法
  • 调用browser的show方法

然后就解决了卡顿的问题。
虽然性能可能低一些,但是没什么大影响,解决问题就行。

if file_path.endswith('.html'):
    f = open(file_url,'r',encoding='utf-8')
    html = f.read()
    self.browser.stop()
    self.browser.setHtml(html)
else:
    self.browser.stop()
    self.browser.load(QUrl('file:///' + file_url))

self.browser.show()

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 解决方案 为了使 `QWebEngineView` 能够成功加载并显示本地 HTML 文件,可以采用多种方法来处理路径和文件加载问题。 #### 方法一:构建绝对路径并使用 `load()` 函数 当保存了一个网页作为 HTML 文件,并希望在 `QWebEngineView` 中展示时,需注意路径配置。可以通过获取应用程序目录路径并与目标 HTML 文件名拼接形成完整的文件路径[^1]: ```cpp QString htmlPath = QCoreApplication::applicationDirPath() + "/message/style2.html"; this->load(QUrl::fromLocalFile(htmlPath)); ``` 此方式适用于已知确切位置的情况,确保了路径准确性的同时简化了操作流程。 #### 方法二:直接读取HTML内容再注入到WebView中 另一种做法是从指定的 HTML 文件读取出其全部内容字符串形式,之后利用 `setHtml()` 接口将其设置给 `QWebEngineView` 实例对象[^2]: ```cpp QString htmlPath = QCoreApplication::applicationDirPath() + "/message/style2.html"; // 打开文件准备读取数据 QFile file(htmlPath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open the file."; } // 创建 QTextStream 对象用于方便地从文件流里提取文本信息 QTextStream stream(&file); // 将整个文档的内容一次性读入内存缓冲区 QString content = stream.readAll(); // 关闭打开过的资源释放句柄 file.close(); // 设置 WebView 的初始页面为刚才读出来的静态网页源码 webView.setHtml(content, QUrl().resolved(QFileInfo(htmlPath).absoluteFilePath())); ``` 这种方法的好处在于可以直接控制要呈现的具体内容而不必担心外部链接的有效性问题;缺点则是对于大型复杂网站可能不太适用因为会占用较多内存空间。 #### 方法三:通过 URL 加载本地文件 如果想要保持原有结构不变,则可以选择直接提供一个指向该 HTML 文档所在磁盘地址的标准 URI 给 `load()` 或者 `setUrl()` 函数调用即可完成任务[^3][^4]: ```cpp QString htmlPath = QCoreApplication::applicationDirPath() + "/message/style2.html"; if (QFile::exists(htmlPath)){ webView.load(QUrl(QString("file:///%1").arg(htmlPath))); } else{ qDebug()<<"The specified path does not exist!"; } ``` 这种方式最为直观简单,在大多数情况下都能正常工作,不过需要注意的是不同操作系统之间关于如何表示文件系统的差异可能会引起兼容性方面的小麻烦。 以上就是几种让 `QWebEngineView` 正确解析并渲染来自本机存储设备上的超文本标记语言的方法介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值