Qt:QWebEngineView显示网页失败

今天在新电脑搭建qt开发环境,在运行程序时发现通过QWebEngineView显示的html失败,同样的代码在旧电脑上没有这个问题

分析过程

(1)qt出现如下信息提示

[21296:12076:0325/161831.084:ERROR:platform_handle_in_transit.cc(34)] DuplicateHandle failed: 拒绝访问。 (0x5)

这个错误表明 Chromium(QtWebEngine 的底层引擎)在尝试创建进程间通信(IPC)句柄时失败了,通常是由于 权限不足进程冲突 引起的。

可能原因

  • 杀毒软件或防火墙 阻止 QtWebEngineProcess.exe 访问 IPC 句柄。

  • 进程权限问题,可能是以 管理员普通用户 启动,导致 QWebEngineView 的子进程无法正确继承权限。

  • MSVC 运行库问题,如果 QtWebEngine 依赖的 MSVC2017 运行库缺失或损坏,也可能导致这个问题。

(2)分析可能原因一

直接在qt上编译运行源代码,无法显示网页,在任务管理器中搜索QtWebEngineProcess.exe,没有看到该程序在运行。

然后通过windeployqt打包该项目直接运行(没有通过管理员运行),发现网页能正确显示,并且任务管理器能看到 QtWebEngineProcess.exe在运行

直接编译运行项目无法显示网页,而打包后的程序能够正常显示网页,这表明问题可能与 运行时的环境配置资源加载路径 有关。

编译运行 时,QtWebEngine 需要加载特定的资源(如 QtWebEngineProcess.exe 等)。这些资源通常与程序的可执行文件分开,在打包后,这些资源被正确地包含在安装包中,因此能正常工作,而在开发环境中,可能由于路径配置不正确或某些资源缺失,导致无法加载网页。

所以要解决网页无法显示的问题,需要解决QtWebEngine 依赖资源路径问题

chatgpt给出的关于“解决QtWebEngine 依赖资源路径问题”解决方案如下:

  1. 确保 QtWebEngine 依赖文件被正确加载

    • 在开发模式下运行时,QtWebEngineProcess.exe 和其他 QtWebEngine 资源需要位于程序的可执行文件同级目录,或者设置为在 Qt 配置文件中指定的正确路径。

    • 你可以检查程序输出目录中是否包含 QtWebEngine 相关的 DLL 和进程文件。

然后自己先尝试通过配置qt的环境变量,但是发现没有起作用。最后通过以下方式来确保qt在运行时将QtWebEngine 所需的资源都能正确加载:

使用 windeployqt 工具:

  • Qt 提供了 windeployqt 工具,可以自动将应用程序所需的 Qt 库和插件复制到可执行文件目录。​

  • 在命令行中,导航到可执行文件所在的目录,运行以下命令:

  • windeployqt your_application.exe

  • 这将自动将所有必需的 Qt 库和插件复制到当前目录。

总结:QWebEngineView显示网页失败的根本原因在于在qt运行时 QtWebEngine 所需的资源没有被正确加载,因为本人还没去深入了解使用QWebEngineView显示网页的全流程,可能是因为缺少了一个正式的添加 webenginewidgets模块的步骤导致所需资源没能被正确加载,因此只能通过这种方式手动添加资源到编译路径的exe同级目录下。

### 回答1: 在Qt中,使用QWebEngineView类可以方便地获取网页的源码。 首先,需要在项目中包含QWebEngineView头文件: ```cpp #include <QWebEngineView> ``` 然后,在需要获取网页源码的地方创建一个QWebEngineView对象: ```cpp QWebEngineView *view = new QWebEngineView(); ``` 接下来,通过调用setUrl()函数设置要访问的网页地址: ```cpp view->setUrl(QUrl("http://www.example.com")); ``` 然后,通过加载完成的信号来获取网页源码: ```cpp connect(view, &QWebEngineView::loadFinished, [=](bool ok){ if(ok){ QString html = view->page()->toHtml(); // 在这里可以对html进行处理或者输出 } }); ``` 最后,通过view->show()来显示网页。当网页加载完成后,通过toHtml()函数可以获取到网页的源码,可以对源码进行处理或者进行输出。 需要注意的是,QWebEngineView依赖于Qt的WebEngine模块,需要在项目配置文件中添加对应的模块依赖。 以上就是使用QtQWebEngineView类获取网页源码的基本步骤。希望对你有帮助! ### 回答2: QtQWebEngineView类提供了一种简便的方法来获取网页源码。要获取网页源码,可以使用QWebEngineView的page()函数获取当前打开的网页页码。然后,可以使用QWebEnginePage类的toHtml()函数将网页内容转换为HTML格式的字符串。 下面是一个简单的示例代码: ```cpp #include <QApplication> #include <QWebEngineView> #include <QWebEnginePage> #include <QString> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个QWebEngineView对象 QWebEngineView view; // 加载一个网页 view.setUrl(QUrl("https://www.example.com")); // 等待页面加载完成 view.page()->profile()->clearHttpCache(); QObject::connect(view.page(), &QWebEnginePage::loadFinished, [&view](bool ok) { if (ok) { // 获取网页源码 QString html = view.page()->toHtml(); // 打印网页源码 qDebug() << html; } else { qDebug() << "网页加载失败"; } // 退出应用 QApplication::quit(); }); // 运行应用 return app.exec(); } ``` 在这个例子中,我们首先创建一个QWebEngineView对象,并使用setUrl()函数指定要加载网页。然后,使用QWebEnginePage的toHtml()函数获取已加载网页的源码。最后,我们在loadFinished信号的回调函数中将网页源码输出到控制台。 这样,我们就可以使用QtQWebEngineView类方便地获取网页的源码了。 ### 回答3: QtQWebEngineView类提供了一种获取网页源码的方法。我们可以使用QWebEngineView的page()方法获取QWebEnginePage对象,然后使用其toHtml()方法获取网页的HTML源码。 示例代码如下: ```cpp // 创建QWebEngineView对象 QWebEngineView *webView = new QWebEngineView(this); // 加载网页 webView->setUrl(QUrl("http://www.example.com")); // 获取网页源码 webView->page()->toHtml([=](const QString &html){ // 在此处处理网页源码 qDebug() << html; }); ``` 以上代码中,我们通过将URL设置为所需页面的地址来加载网页。然后使用page()方法获取QWebEnginePage对象,并使用其toHtml()方法获取网页的源码。toHtml()方法是一个异步操作,它接受一个lambda表达式作为参数,在该lambda表达式中可以处理获取到的网页源码。 在示例代码中,我们使用一个简单的QDebug语句将获取到的网页源码打印到控制台。你可以根据需要自行处理获取到的网页源码。 需要注意的是,为了使用QWebEngineView类,需要在项目文件中添加对Qt WebEngine模块库的引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值