Qt WebEngine Widgets的使用

一、Qt WebEngine基本概念

        Qt WebEngine中主要分为三个模块:Qt WebEngine Widgets模块,主要用于创建基于C++ Widgets部件的Web程序;Qt WebEngine模块用来创建基于Qt Quick的Web程序;Qt WebEngine Core模块用来与Chromeium交互。网页玄幻和JavaScript的执行从GUI进程分离到Qt WebEngine进程,主要架构如下。

二、Qt WebEngine Widgets


本文主要关注Qt WebEngine Widgets模块,其架构如下。QWebEngineView是主要窗体类组件,用来加载Web。QWebEnginePage包含在QWebEngineView中,主要包含了Web页面的主框架,负责内容分、浏览历史QWebEngineHistory等。配置QWebEngineProfile用于区分不同的Page,属于同一个Web引擎配置的所有网页共享设置Settings、脚本Script和Cookies。

三、一个简易的浏览器

        重写QWebenginePage的acceptNavigationRequest进行导航设置,没有特殊需求可只用用基类。

class CustomWebEnginePage : public QWebEnginePage {Q_OBJECT
public:CustomWebEnginePage(QObject *parent = nullptr) : QWebEnginePage(parent) {}bool acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame) override {if (type == QWebEnginePage::NavigationTypeLinkClicked && isMainFrame) {load(url); // 允许在当前页面打开新链接return false; // 阻止默认打开新窗口的行为}return QWebEnginePage::acceptNavigationRequest(url, type, isMainFrame);}
};

 浏览器页面实现细节:


void Test2015::TestWebEngineWidget()
{if (ui.frameWeb){auto& pParent = ui.webEngineView;auto& pWebView = ui.webEngineView;//pWebView->setPage(new CustomWebEnginePage(pWebView));pWebView->load(QUrl("https://blog.csdn.net/WSTONECH?type=blog"));QWebEngineSettings::globalSettings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true);pWebView->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true);pWebView->settings()->setAttribute(QWebEngineSettings::LinksIncludedInFocusChain, true);//工具栏urlEdit = new QLineEdit(pParent);backButton = new QPushButton("Back", pParent);forwardButton = new QPushButton("Forward", pParent);refreshButton = new QPushButton("Refresh", pParent);goButton = new QPushButton("Go", pParent);favBtn = new QPushButton("收藏", pParent);QHBoxLayout *toolbarLayout = new QHBoxLayout(ui.frameToolBar);toolbarLayout->addWidget(backButton);toolbarLayout->addWidget(forwardButton);toolbarLayout->addWidget(refreshButton);toolbarLayout->addWidget(urlEdit);toolbarLayout->addWidget(goButton);toolbarLayout->addWidget(favBtn);//历史记录ListViewhistoryModel = new QStringListModel(pParent);ui.listView_History->setModel(historyModel);//进度条ui.progressBar->setMaximum(100);ui.progressBar->setVisible(false);//connect(urlEdit, &QLineEdit::returnPressed, [=]() {QString urlStr = urlEdit->text().trimmed();QUrl url = urlStr.startsWith("http") ? QUrl(urlStr) : QUrl("https://" + urlStr);if (url.isValid()) {pWebView->setUrl(url);}});connect(pWebView->page(), &QWebEnginePage::urlChanged, urlEdit, [=](QUrl url) {urlEdit->setText(url.toString());});//进度条更新connect(pWebView, &QWebEngineView::loadProgress, this, [=](int progressValue) {if (progressValue == 100) {ui.progressBar->setVisible(false);}else {ui.progressBar->setVisible(true);ui.progressBar->setValue(progressValue);}});//更新历史地址 页面加载完成在记录历史地址防止未完全加载title等无法解析connect(pWebView, &QWebEngineView::loadFinished, this, [=](bool ok) {if (ok){historyUrls.clear();QList<QWebEngineHistoryItem> items = pWebView->history()->items();for (const QWebEngineHistoryItem& item : items) {if (item.isValid() && (item.url().toString() != "about:blank")){string title = item.title().toStdString();string urlstr = item.url().toString().toStdString();historyUrls.append(item.title() + " - " + item.url().toString());}}historyModel->setStringList(historyUrls);}});//connect(ui.listView_History->selectionModel(), &QItemSelectionModel::currentChanged,this, [=](const QModelIndex& index) {if (!index.isValid()) return;QList<QWebEngineHistoryItem> items = pWebView->history()->items();if (index.row() >= 0 && index.row() < items.size()) {pWebView->load(items[index.row()].url());}});connect(favBtn, &QPushButton::clicked, this, [=]() {QString url = pWebView->url().toString();});connect(backButton, &QPushButton::clicked, this, [=]() {if (pWebView->page()->history()->canGoBack()) {pWebView->back();}});connect(forwardButton, &QPushButton::clicked, this, [=]() {if (pWebView->page()->history()->canGoForward()) {pWebView->forward();}});connect(refreshButton, &QPushButton::clicked, pWebView, &QWebEngineView::reload);connect(goButton, &QPushButton::clicked, this, [=]() {QString input = urlEdit->text();QUrl url;if (input.startsWith("http://") || input.startsWith("https://")) {url = QUrl(input);}else {url = QUrl("https://" + input);}if (url.isValid()) {pWebView->setUrl(url);}});}
}

实现效果​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90287.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】标准模板库(STL)—— 学习算法的利器

【C】标准模板库&#xff08;STL&#xff09;—— 学习算法的利器学习 STL 需要注意的几点及 STL 简介一、什么是 STL&#xff1f;二、学习 STL 前的先修知识三、STL 常见容器特点对比四、学习 STL 的关键注意点五、STL 学习路线建议六、总结七、下一章 vector容器快速上手学习…

YOLO算法演进综述:从YOLOv1到YOLOv13的技术突破与应用实践,一文掌握YOLO家族全部算法!

引言&#xff1a;介绍目标检测技术背景和YOLO算法的演进意义。YOLO算法发展历程&#xff1a;使用阶段划分方式系统梳理各代YOLO的技术演进&#xff0c;包含早期奠基、效率优化、注意力机制和高阶建模四个阶段。YOLOv13的核心技术创新&#xff1a;详细解析HyperACE机制、FullPAD…

快速将前端得依赖打为tar包(yarn.lock版本)并且推送至nexus私有依赖仓库(笔记)

第一步创建js文件 文件名为downloadNpmPackage.jsprocess.env.NODE_TLS_REJECT_UNAUTHORIZED "0";const fs require("fs"); const path require("path"); const request require("request");// 设置依赖目录 const downUrl "…

Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(结)

Unity VS Unreal Engine &#xff0c;“电影像游戏的时代” 新手如何抉择引擎&#xff1f;(1)-CSDN博客 这是我的上一篇文章&#xff0c;如果你仍然困惑选择引擎的事情&#xff0c;我们不妨从别的方面看看 注意&#xff1a;我们可能使用"UE5"来表示Unreal Engine系…

EVAL长度限制突破方法

EVAL长度限制突破方法 <?php $param $_REQUEST[param]; If (strlen($param) < 17 && stripos($param, eval) false && stripos($param, assert) false) //长度小于17&#xff0c;没有eval和assert关键字 {eval($param); } //stripos — 查找字符串…

Linux部署.net Core 环境

我的环境 直接下载安装就可以了 wget https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.315/dotnet-sdk-8.0.315-linux-x64.tar.gzmkdir -p $HOME/dotnet && tar zxf dotnet-sdk-8.0.315-linux-x64.tar.gz -C $HOME/dotnet export DOTNET_ROOT$HOME/dotnet expor…

ARM-定时器-PWM通道输出

学习内容需求点亮4个灯&#xff0c;采用pwm的方式。定时器通道引脚AFLED序号T3CH0PD12AF2LED5CH1PD13AF2LED6CH2PD14AF2LED7CH3PD15AF2LED8实现LED5, LED6, LED7, LED8呼吸灯效果通用定时器多通道点亮T3定时器下的多个通道的灯。开发流程添加Timer依赖初始化PWM相关GPIO初始化P…

javaSE(List集合ArrayList实现类与LinkedList实现类)day15

目录 List集合&#xff1a; 1、ArrayList类&#xff1a; &#xff08;1&#xff09;数据结构&#xff1a; &#xff08;2&#xff09;扩容机制 &#xff08;3&#xff09;ArrayList的初始化&#xff1a; &#xff08;4&#xff09;ArrayList的添加元素方法 &#xff08;5…

解决 WSL 中无法访问 registry-1.docker.io/v2/,无法用 docker 拉取 image

文章目录无法拉取docker镜像补充迁移 WSL 位置Install Docker无法拉取docker镜像 docker run hello-world Unable to find image hello-world:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline excee…

【C++】简单学——list类

模拟实现之前需要了解的概念带头双向链表&#xff08;double-linked&#xff09;&#xff0c;允许在任何位置进行插入区别相比vector和string&#xff0c;多了这个已经没有下标[ ]了&#xff0c;因为迭代器其实才是主流&#xff08;要包头文件<list>&#xff09;方法构造…

Qt 国际化与本地化完整解决方案

在全球化的今天&#xff0c;软件支持多语言和本地化&#xff08;Internationalization & Localization&#xff0c;简称i18n & l10n&#xff09;已成为基本需求。Qt提供了一套完整的解决方案&#xff0c;帮助开发者轻松实现应用程序的国际化支持。本文将从原理到实践&a…

MNIST 手写数字识别模型分析

功能概述 这段代码实现了一个基于TensorFlow和Keras的MNIST手写数字识别模型。主要功能包括&#xff1a; 加载并预处理MNIST数据集构建一个简单的全连接神经网络模型训练模型并评估其性能使用训练好的模型进行预测保存和加载模型 代码解析 1. 导入必要的库 import matplot…

进阶系统策略

该策略主要基于价格动态分析,结合多种技术指标和数学计算来生成交易信号。其核心逻辑包括: 1. 价格极值计算:首先,策略计算给定周期(由`Var3`定义)内的最高价和最低价,分别存储在`Var12`和`Var13`中。这一步骤旨在捕捉价格的短期波动范围。 2. 相对位置计算:接着,策…

【Linux内核】Linux驱动开发

推荐书籍&#xff1a; 《Linux内核探秘&#xff1a;深入解析文件系统和设备驱动的架构与设计》 知识点 x86的IO地址空间和内存地址空间是独立的两套地址空间&#xff0c;并且使用不同的指令访问。MOV, IN, OUT。内存映射I/O可以将IO映射到内存。ARM等RISC采用统一编编址&#x…

MySQL用户管理(15)

文章目录前言一、用户用户信息创建用户修改密码删除用户二、数据库的权限MySQL中的权限给用户授权回收权限总结前言 其实与 Linux 操作系统类似&#xff0c;MySQL 中也有 超级用户 和 普通用户 之分 如果一个用户只需要访问 MySQL 中的某一个数据库&#xff0c;甚至数据库中的某…

react19相关问题和解答

目录 1. react19将ref放在了props中(不再需要 forwardRef),那么是不是可以通过ref获取子组件的全部变量了? 我的子组件的useImperativeHandle还需要定义吗? 1.1. ref 在 props 中的本质变化 1.2. 为什么不能访问全部变量? 2. In HTML,cannot be a descendant of. Thi…

Code Composer Studio:CCS 设置代码折叠

Code Composer Studio&#xff1a;设置代码折叠,可以按函数&#xff0c;if, 等把代码折叠起来。1.2.开启折叠选项3.开启后&#xff0c;如果文件已经打开&#xff0c;要关掉重新打开文件就可以开到折叠功能生效。

JMeter groovy 编译成.jar 文件

groovy 编译 一、windows 下手动安装Groovy 下载 Groovy 二进制包 前往官网&#xff1a;https://groovy.apache.org/download.html 下载 Binary release&#xff08; https://groovy.jfrog.io/ui/native/dist-release-local/groovy-zips/apache-groovy-sdk-4.0.27.zip &#xf…

使用maven-shade-plugin解决依赖版本冲突

项目里引入多个版本依赖时&#xff0c;最后只会使用其中一个&#xff0c;一般可以通过排除不使用的依赖处理&#xff0c;但是如果需要同时使用多个版本&#xff0c;可以使用maven-shade-plugin解决。以最典型的poi为例&#xff0c;poi版本兼容性很低&#xff0c;如果出现找不到…

[CH582M入门第十一步]DS18B20驱动

学习目标: 1、介绍DS18B20 2、学习单总线 3、学习DS18B20程序驱动一、DS18B20介绍 DS18B20 是一款由 Maxim Integrated(原Dallas Semiconductor) 推出的 数字温度传感器,以其单总线(1-Wire)通信协议、高精度和广泛应用而闻名。以下是其核心特点和应用介绍: 主要特性 数…