当前位置: 首页 > news >正文

QT 应用程序中集成浏览器

QT 应用程序中集成浏览器

    • 前言

前言

在很多情况下,我们需要在应用程序中集成浏览器,比如应用程序界面是使用 H5 页面开发,或者我们的应用程序需要访问 Web 网站。

应用程序中集成浏览器,并不一定是需要一个具有地址栏、多标签等全功能的浏览器,大多数情况下只是需要一个能够现实 H5 页面的浏览器外壳。

在 QT 应用程序中集成浏览器,最简单的方法是使用 QtWebEngine。

QtWebEngine 是 Qt 框架中的一个模块,用于在应用程序中集成现代 Web 技术。它基于 Chromium 开源项目,提供了一个用于显示 Web 内容的浏览器引擎,使开发者能够在他们的 Qt 应用程序中嵌入 Web 内容和功能。QtWebEngine 提供了一个易于使用的 API,开发者可以使用它来创建具有 Web 功能的应用程序,如浏览器、HTML5 游戏、在线帮助系统等。QtWebEngine 允许开发者在应用程序中直接使用 HTML、CSS、JavaScript 等 Web 技术,同时提供了与 Qt 框架的无缝集成,使开发者能够轻松管理和控制 Web 内容的展示和行为。

但是,QtWebEngine 模块基于的 Chromium 版本比较老,并没有随着 Chromium 项目快速迭代。比如我们使用的 Qt 5.15.2 中的 QtWebEngine 模块使用的是 Chromium 78 版本,而最新的 Chromium 版本已经到了 121。大多数情况下我们不需要跟进最新版本,但如果应用程序所访问的网站使用了最新的前端技术,那么 QtWebEngine 可能会出现一些显示异常的问题。

虽然 QtWebEngine 和 Chromium 都是开源的,但这两个项目都相当庞大,要升级到最新的 Chromium 版本,难度和工作量都相当大。

我们还有第二种选择,就是使用 CEF 框架。

CEF (Chromium Embedded Framework) 是一个开源项目,它允许开发者在自己的应用程序中嵌入 Chromium 浏览器引擎。它基于 Google 的 Chromium 项目,提供了一个稳定的、高性能的、现代的浏览器引擎,开发者可以通过 CEF 将其集成到自己的桌面应用程序中。

CEF 的优势之一是它提供了灵活的自定义和扩展性。开发者可以通过添加自定义的 JavaScript 扩展或使用 Chromium 的内置 API 来扩展和定制浏览器的功能。此外,CEF 还提供了一套丰富的 API,用于控制浏览器的行为、处理用户输入、管理 Web 内容等方面。

和 QtWebEngine 不同之处在于,CEF 采用了滚动发布策略,其主要特点包括:

  1. 持续更新: CEF 通过持续不断地将 Chromium 的最新代码集成到其代码库中,实现持续更新。这意味着 CEF 的开发者可以随时访问和使用最新的 Chromium 特性和改进。

  2. 频繁发布: CEF 以较短的周期发布新版本,通常每周或每两周发布一个新版本。这使得开发者能够更快地获得最新的功能、性能改进和安全补丁。

  3. 版本稳定性: 尽管采用了持续更新和频繁发布的策略,CEF 仍然会在每个版本中进行测试和验证,以确保版本的稳定性和可靠性。

  4. 向后兼容: CEF 的滚动发布策略通常会保持向后兼容性,即在新版本中引入的改进和功能不会破坏现有的应用程序或功能。

在 QT 应用程序中集成 CEF,可以获得较新的 Chromium 内核,升级 Chromium 版本也相对容易一些。

相关文章:

  • 数据库学习笔记2024/2/5
  • 阅读笔记——《RapidFuzz: Accelerating fuzzing via Generative Adversarial Networks》
  • 算法学习——华为机考题库10(HJ64 - HJ69)
  • CTF-show WEB入门--web21
  • Oracle分析SQL执行调优
  • 为什么说Python语法简单?
  • Redis核心技术与实战【学习笔记】 - 28.Redis 6.0新特性(多线程、客户端缓存与安全)
  • NLP_词的向量表示Word2Vec 和 Embedding
  • MySQL 用户管理
  • 基于SSM的便民自行车管理系统的开发与实现(有报告)。Javaee项目。ssm项目。
  • 如何从dockerhub 中运行一个简单项目
  • 基于单片机的智能寻光小车设计
  • P4408 [NOI2003] 逃学的小孩
  • C++ 11新特性之tuple
  • linux上部署ftp服务
  • #Java异常处理
  • 《Java编程思想》读书笔记-对象导论
  • 【React系列】如何构建React应用程序
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript对象详解
  • Linux各目录及每个目录的详细介绍
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 回顾 Swift 多平台移植进度 #2
  • 巧用 TypeScript (一)
  • 系统认识JavaScript正则表达式
  • 小而合理的前端理论:rscss和rsjs
  • 原生 js 实现移动端 Touch 滑动反弹
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​Java并发新构件之Exchanger
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​什么是bug?bug的源头在哪里?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #NOIP 2014#Day.2 T3 解方程
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (十) 初识 Docker file
  • .NET Core跨平台微服务学习资源
  • .NET 中的轻量级线程安全
  • .net打印*三角形
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [Apio2012]dispatching 左偏树
  • [BUG] Authentication Error
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [CSS]文字旁边的竖线以及布局知识
  • [CTO札记]如何测试用户接受度?
  • [C语言]一维数组二维数组的大小
  • [emuch.net]MatrixComputations(7-12)
  • [Geek Challenge 2023] web题解
  • [HackMyVM]靶场 Quick3
  • [hdu4622 Reincarnation]后缀数组
  • [IDF]啥?
  • [InnoDB系列] -- SHOW INNODB STATUS 探秘
  • [LeeCode]-Divide Two Integers 不用乘除的除法运算