QWebEngine应用(一)

news/2024/12/22 9:42:54/

前言

很早以前就听说过Qt也能显示网页,一直没有机会真正研究应用起来,刚好最近项目中使用到了QWebEngine内嵌浏览器打开第三方的网站,使用的Qt版本为5.15,踩了不少的坑,这里做个总结。

QWebEngine架构

  • Qt WebEngine Widgets---用于创建基于widget的web应用程序
  • Qt WebEngine Module---用于创建基于Qt Quick的web应用程序
  • Qt WebEngine Core---Qt WebEngine Core与Chromium相互作用
  • Qt WebEngine Process---页面渲染和JavaScript执行进程

 Qt WebEngine Widgets

Web引擎视图是Qt WebEngine模块的主要小部件组件。它可用于各种应用程序来加载网页内容。在视图中,Web引擎页面包含一个主框架,负责Web内容、导航链接的历史操作。视图和页面非常相似,因为它们提供了一组共同的功能。

所有页面都属于包含共享设置脚本cookieWeb引擎配置文件。配置文件可用于将页面相互隔离。一个典型的用例是私人浏览模式的专用配置文件,其中不会永久保存任何信息。

 Qt WebEngine Module

Qt WebEngine QML实现包含与Qt WebEngine Widgets实现相同的元素,只是没有单独访问的Web引擎页面。支持的页面功能已集成到Web引擎视图中。

 Qt WebEngine Core

Qt WebEngine核心基于Chromium Project。Chromium提供自己的网络和渲染引擎,并与其依赖模块紧密合作开发。

Qt WebEngine Process

Qt WebEngine进程是一个单独的可执行文件,用于渲染网页和执行JavaScript。这缓解了安全问题,并隔离了由特定内容引起的崩溃。我们日常使用的浏览器也是基于多进程实现,一个tab对应一个进程。

上面的框架说明来自Qt官方文档,QWebEngine有QWidget和QML两种加载网页的方式,其中都是调用封装了谷歌Chromium内核的QWebEngineCore模块,可根据项目情况选择widget或者qml框架。本人现在用qml比较多,后续介绍的内容也主要是针对qml。

WebEngineView基本用法

int main(int argc, char *argv[])
{QCoreApplication::setOrganizationName("QtExamples");QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);QtWebEngine::initialize();QGuiApplication app(argc, argv);QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/main.qml")));return app.exec();
}
import QtQuick 2.0
import QtQuick.Window 2.0
import QtWebEngine 1.0Window {width: 1024height: 750visible: trueWebEngineView {anchors.fill: parenturl: "https://www.qt.io"}
}

qml中使用需在Qt Quick Engine前执行QtWebEngine::initialize();,该初始化操作是为了确保OpenGL上下文可以在GUI和渲染进程之间共享,如果用的是widget,是不需要这一步。

打包发布

Win下打包用windeployqt工具正常打包即可,QML项目打包出来包含以下项目,缺一个都不能正常使用

 Mac下打包同样的用macdeployqt打包,但是打包出来的QWebEngineCore库是不完整的,需手动拷复制,这个应该是Qt5.15macdeployqt的bug

 Mac下使用QWebEngine,QWebEngineCore库必须是放在调用的进程的上一级目录的Frameworks,如果你的项目是多进程,子进程也有用QWebEngine,如果想和主进程共用一份库,那样会有问题,子进程会报错icu_util.cc(199)] Couldn't mmap icu data file,这个问题在Qt6.4上验证是解决了。

结语

本篇文章是针对QWebEngine应用的一个综述,后面针对项目中运用到的具体内容做介绍,主要有cookies的存储应用、注入javasript、基于QWebChannel实现网页与C++通信等内容。


http://www.ppmy.cn/news/711984.html

相关文章

手机验证码测试点

手机短信认证测试点1,输入手机号码,待收到手机验证码后,更改原来手机号码,输入验证码,提示:失败 (注意这个漏测了)2,输入手机号码,待收到手机验证码后,输入验证码 ,成功3,输入手机号…

给手机发送验证码

给手机发送验证码 PostMapping("/code")public ResponseEntity<Void> sendCode(RequestParam("phone") String phone) {if (StringUtils.isBlank(phone)) {return new ResponseEntity<>(HttpStatus.BAD_REQUEST);}// TODO 对手机格式进行正则校…

发送手机验证码

发送手机验证码 1. 利用网易云云信平台发送手机验证码 import random import string import time import hashlib from urllib import parse, request def send_sms():# 请求的urlapi https://api.netease.im/sms/sendcode.action ​# 准备headers中的参数# 网易云信平台分配…

手机短信验证码解决方案

网站或者APP的新用户注册环节&#xff0c;基本上会用到用户手机号验证功能&#xff0c;该功能是否安全、稳定会直接影响新注册用户的转化率。 企业使用新用户注册功能&#xff0c;通常会遇到以下两方面的问题&#xff1a; 短信接口防刷 一、短信接口被刷 1、产生原因 因为新…

如何防止刷短信验证码?

问题&#xff1a;在前端使用云服务实现发送短信业务时&#xff0c;若未启用验证码防刷机制&#xff0c;会导致他人恶意或者无意刷新验证码&#xff0c;导致服务器压力变大&#xff0c;以及短信服务超额。 解决方案&#xff1a;采用redis存储短信验证码&#xff0c;在前端以及后…

登录之手机号验证码登录

今天测试云之讯api 云之讯官网提供源码只需要修改就好 我的是放入tp5路径如下&#xff1a;前端代码脑补 只有一个input和按钮 直接上代码 index.php <?php namespace app\admin\controller; use think\Db; use think\Loader; use think\Controller; use app\admin\contr…

手机发送验证码

1 需求 发送短信以后&#xff0c;再次发送短信按钮变得不可用&#xff0c;倒计时60秒以后才可以使用 2 步骤 创建按钮倒计时的方法&#xff1a;function countDown(count)&#xff0c;在发送短信请求以后调用 发送短信按钮不可用 每过1秒调用1次匿名函数 匿名函数中计数减1…

某注册页面存在手机短信验证码绕过

某注册页面存在手机短信验证码绕过的情况 关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭…