详解 Qt WebEngine 模块

Qt WebEngine 模块是 Qt 提供的一个功能强大的模块,用于在 Qt 应用中嵌入和显示现代网页内容。该模块基于 Chromium 引擎,支持丰富的 Web 技术(如 HTML5、CSS3、JavaScript 等),适合需要嵌入网页浏览、Web 应用、JavaScript 交互等功能的桌面应用程序。

1. Qt WebEngine 的主要组件

Qt WebEngine 提供了一些核心类,用于网页显示、加载、交互等操作。以下是主要的类及其用途:

  • QWebEngineView:这是用于显示网页的主要控件类,继承自 QWidget。可以通过 QWebEngineView 进行网页加载、显示、导航等操作。

  • QWebEnginePage:代表一个网页内容的控制类,提供了网页内容和浏览控制的功能,如处理导航、管理 JavaScript 和 Cookie 访问等。

  • QWebEngineProfile:代表用户的 Web 浏览配置文件,管理 Cookie、缓存、历史记录和自定义设置。一个应用可以有多个 QWebEngineProfile,每个配置文件可以代表不同的用户。

  • QWebEngineSettings:用于配置 QWebEnginePageQWebEngineProfile 的设置,允许启用或禁用功能(如 JavaScript、插件、图像加载等)。

  • QWebEngineScript:用于在网页加载时执行 JavaScript 脚本。可以设置为在页面加载前或加载后执行。

  • QWebEngineDownloadItem:管理下载项,允许追踪和控制下载进度、暂停和恢复下载等。

2. 如何在 Qt 中使用 QWebEngineView
步骤 1:在 .pro 文件中添加模块

要使用 Qt WebEngine,需要在 .pro 文件中包含 webenginewidgets 模块:

QT += webenginewidgets
步骤 2:代码示例

以下是一个简单的代码示例,展示如何使用 QWebEngineView 加载并显示一个网页:

#include <QApplication>
#include <QWebEngineView>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWebEngineView view;view.setUrl(QUrl("https://www.qt.io"));  // 加载网页view.resize(1024, 768);view.show();return app.exec();
}
3. Qt WebEngine 的常用功能
加载网页

可以使用 QWebEngineView::setUrl()QWebEnginePage::load() 方法加载网页。例如:

QWebEngineView *view = new QWebEngineView;
view->setUrl(QUrl("https://www.example.com"));
运行 JavaScript

可以通过 QWebEnginePage::runJavaScript() 方法在页面上运行 JavaScript 代码,并可以获取返回值。例如:

view->page()->runJavaScript("document.title", [](const QVariant &result){qDebug() << "Page title:" << result.toString();
});
处理页面导航

QWebEnginePage 提供了导航控制信号,例如 loadStarted()loadProgress()loadFinished()。可以通过这些信号实现加载进度条等功能。

connect(view->page(), &QWebEnginePage::loadFinished, [](bool ok) {if (ok) {qDebug() << "Page loaded successfully!";} else {qDebug() << "Failed to load page.";}
});
与 JavaScript 交互

可以使用 QWebChannel 将 C++ 对象暴露给网页,以便在 JavaScript 中调用。需要使用 qwebchannel.js 文件(在 Qt WebEngine 安装目录中找到)来启用此功能。

// 在 C++ 中
class WebBridge : public QObject {Q_OBJECT
public slots:void cppFunction() {qDebug() << "C++ function called from JavaScript!";}
};// 将 C++ 对象暴露给 JavaScript
QWebEngineView *view = new QWebEngineView;
QWebChannel *channel = new QWebChannel(view->page());
WebBridge *bridge = new WebBridge();
channel->registerObject(QStringLiteral("bridge"), bridge);
view->page()->setWebChannel(channel);
view->setUrl(QUrl("qrc:/webpage.html"));  // 加载网页// 在 JavaScript 中调用 C++ 函数(网页内容)
bridge.cppFunction();
自定义浏览设置

可以使用 QWebEngineSettings 配置是否启用 JavaScript、自动加载图像等。例如:

view->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
view->settings()->setAttribute(QWebEngineSettings::AutoLoadImages, true);
文件下载管理

QWebEnginePage::profile() 可以获取 QWebEngineProfile 对象,从而管理下载。可以连接到 downloadRequested 信号处理下载:

connect(view->page()->profile(), &QWebEngineProfile::downloadRequested,[](QWebEngineDownloadItem *download) {download->setPath("path/to/save/file");download->accept();});
4. 注意事项
安装 Qt WebEngine

Qt WebEngine 并不是 Qt 的默认模块,在安装 Qt 时需要选中 Qt WebEngine 组件。如果已经安装 Qt,可以使用 Qt Maintenance Tool(维护工具)来添加 Qt WebEngine

平台支持限制

Qt WebEngine 基于 Chromium 引擎,受限于一些平台,不支持 iOS,并且在嵌入式平台上可能需要额外的配置。

应用大小问题

由于包含 Chromium 引擎,Qt WebEngine 模块会显著增加应用程序的体积。对于不需要复杂 Web 功能的应用,可以考虑使用 QTextBrowser 或其他更轻量级的方案。

权限与安全

Qt WebEngine 支持访问文件系统、摄像头等功能,如果您的应用访问这些敏感数据,请注意权限管理和用户隐私保护。

5. 常用信号和槽
  • 加载进度信号

    • loadStarted():页面开始加载时发射。
    • loadProgress(int progress):加载进度发生变化时发射。
    • loadFinished(bool ok):页面加载完成时发射。
  • 导航信号

    • urlChanged(const QUrl &url):页面 URL 改变时发射。
    • titleChanged(const QString &title):页面标题改变时发射。
  • 其他常用槽函数

    • back()forward()reload()stop():控制页面的导航。
    • setZoomFactor(qreal factor):设置页面的缩放因子。
6. 完整的 Qt WebEngine 应用示例

以下是一个完整的示例,包含了网页加载、JavaScript 运行、导航控制等基本功能:

#include <QApplication>
#include <QWebEngineView>
#include <QWebChannel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>class WebBridge : public QObject {Q_OBJECT
public slots:void cppFunction() {qDebug() << "C++ function called from JavaScript!";}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建 WebEngineView 和 WebChannelQWebEngineView view;QWebChannel channel;WebBridge bridge;channel.registerObject(QStringLiteral("bridge"), &bridge);view.page()->setWebChannel(&channel);// 加载本地页面或在线页面view.setUrl(QUrl("https://www.qt.io"));view.resize(1024, 768);// 加载 JavaScriptview.page()->runJavaScript("console.log('Hello from JavaScript');");// 创建控制按钮QWidget window;QVBoxLayout layout(&window);QPushButton backButton("Back");QPushButton forwardButton("Forward");layout.addWidget(&backButton);layout.addWidget(&forwardButton);layout.addWidget(&view);// 信号槽连接QObject::connect(&backButton, &QPushButton::clicked, &view, &QWebEngineView::back);QObject::connect(&forwardButton, &QPushButton::clicked, &view, &QWebEngineView::forward);window.show();return app.exec();
}
总结

Qt WebEngine 是一个功能强大的模块,适合需要网页显示和 JavaScript 交互的应用。其基于 Chromium 内核,支持现代 Web 技术(如 HTML5、JavaScript、CSS3),可以用于构建嵌入式浏览器或 Web 应用集成。通过丰富的信号槽机制和自定义配置,Qt WebEngine 可以满足大部分嵌入网页的需求。

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

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

相关文章

sql server索引优化语句

第一步 建一个测试表 --create table TestUsers --( -- Id int primary key identity(1,1), -- Username varchar(30) not null, -- Password varchar(10) not null, -- CreateDateTime datetime not null --)第二步 插入100w数据 大概1分钟执行时间 ----插入数据…

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因&#xff1a; &#xff08;1&#xff09;大量的学科&#xff08;尤其生物及材料科学&#xff09;需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解&#xff1b; &#xff08;2&#xff09;科技的发展促进了综合网…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot&#xff1a;算是“老牌”编程助手了&#xff0c;虽然Copilot在别的编辑器上也有扩展&#xff0c;不过体验最好的还是VS Code&#xff0c;毕竟都是微软家的所以功能集成更好一些&#xff1b;主要提供的是Complete和Chat能力&#xff0c;也就是代码补全…

基于层次化设计方法,设计一个16位二进制全加器

设计思路&#xff1a;先一个半加器和一个或门&#xff0c;每两个半加器构成一个全加器&#xff0c;每四个全加器组成一个4位全加器&#xff0c;再将这4个4位全加器依次相连组成一个16位二进制全加器。 半加器的逻辑表达式&#xff1a;sumAB; coutAB; 半加器的真值表 全加器的逻…

ES搜索原理

ES搜索原理 bg: 搜索的时候&#xff0c;使用模糊查询经常出现搜索不到的情况&#xff0c;不如mysql的like有效。 https://www.bilibili.com/video/BV1yb421J7oX/?spm_id_from333.337.search-card.all.click&vd_source3f917722acc36b0fcca7cca2d21394e2 基础概念 索引&a…

轻松上手:使用 Vercel 部署 HTML 页面教程

&#x1f600; 在学习前端的过程中&#xff0c;部署项目往往是一个令人头疼的问题。然而&#xff0c;Vercel 为我们提供了一个便捷且免费的解决方案。 Vercel 是一个强大的云平台&#xff0c;专门用于前端项目的部署和托管。它不仅支持多种前端框架和静态网站生成器&#xff0…

STL 剖析

STL 六大组件 「STL 六大组件的交互关系」 Container 通过 Allocator 取得数据储存空间Algorithm 通过 Iterator 存取 Container 内容Functor 可以协助 Algorithm 完成不同的策略变化Adapter 可以修饰或套接 Functor、Iterator 配置器(allocator) 配置器&#xff1a;负责空间…

HTTP—03

触发 GET 请求 1&#xff09;直接在浏览器 地址栏 输入 URL&#xff0c;此时构成了一个GET请求 2&#xff09;HTML中的一些特殊标签可能会触发 例如 img,a,link,script... 3&#xff09;通过Form表单触发&#xff08;Form本质也是一个HTML标签&#xff09; 4&#xff0…

C 数组:索引魔杖点化的数据星图阵列

一、数组 1.数组的概念 数组是⼀组相同类型元素的集合&#xff1b;从这个概念中我们就可以发现2个有价值的信息&#xff1a; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。数组中存放的多个数据&#xff0c;类型是相同的。 2.数组的分类 数组主要分为一…

苹果手机怎么清理空间:拯救你的拥挤手机

在数字生活的海洋中&#xff0c;我们的苹果手机就像一艘小船&#xff0c;载满了照片、应用、视频和各种下载的“宝贝”。随着时间的推移&#xff0c;这艘小船开始变得拥挤&#xff0c;航行速度放缓&#xff0c;甚至有时候直接卡壳。苹果手机怎么清理空间&#xff1f;是时候学会…

Ubuntu上如何部署Nginx?

环境&#xff1a; Unbuntu 22.04 问题描述&#xff1a; Ubuntu上如何部署Nginx&#xff1f; 解决方案&#xff1a; 在Ubuntu上部署Nginx是一个相对简单的过程&#xff0c;以下是详细的步骤指南。我们将涵盖安装Nginx、启动服务、配置防火墙以及验证安装是否成功。 1. 更新…

javaScriptBOM

1.1、BOM概述 1.1.1、BOM简介 BOM&#xff08;browser Object&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window。 BOM由一系列的对象构成&#xff0c;并且每个对象都提供了很多方法与属性 BOM缺乏标准…

Unity3D仿星露谷物语开发7之事件创建动画

1、目标 掌握事件通知的Publisher - Subscriber设计模式&#xff0c;并通过事件通知触发动画。 2、发布者/订阅者模式 首先&#xff0c;定义事件Event 然后&#xff0c;Publisher触发事件 最后&#xff0c;Subscriber订阅事件并进行处理 &#xff08;1&#xff09;创建动作…

点击展示大图预览

原文链接在table表格里能够实现&#xff0c;点击里面的图片实现大图预览的效果&#xff1b; 一、先安装viewer — 使用npm安装 npm install v-viewer --save二、在main.js中引入 import Viewer from v-viewer //点击图片大图预览 import viewerjs/dist/viewer.css Vue.use(…

安全算法基础(一)

安全算法是算法的分支之一&#xff0c;还的依靠大量的数学基础进行计算&#xff0c;本文参照兜哥的AI安全样本对抗&#xff0c;做一个简单的算法安全概括&#xff0c;从零学习。 最新的安全算法对于我们常规的攻击样本检测&#xff0c;效果是不理想的&#xff0c;为了探究其原…

aioice里面candidate固定UDP端口测试

环境&#xff1a; aioice0.9.0 问题描述&#xff1a; aioice里面candidate固定UDP端口测试 解决方案&#xff1a; /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…

UE UMG 多级弹出菜单踩坑

多级弹出菜单 https://www.bilibili.com/video/BV1ub411J7nA 运行时添加 widget 的方法 create widget 然后 add child 到某个组件&#xff0c;比如 canvas 运行时修改 widget 位置的方法 set widget slot position 用起来没效果 怀疑是因为我没有传入 slot 但是暂时不知…

金碟中间件-AAS-V10.0安装

金蝶中间件AAS-V10.0 AAS-V10.0安装 1.解压AAS-v10.0安装包 unzip AAS-V10.zip2.更新license.xml cd /root/ApusicAS/aas# 这里要将license复制到该路径 [rootvdb1 aas]# ls bin docs jmods lib modules templates config domains …

linux-----网络编程

网络编程基础概念 IP地址&#xff1a;是互联网协议地址&#xff0c;用于在网络中唯一标识一台设备。在IPv4中&#xff0c;地址是32位的二进制数&#xff0c;通常以点分十进制表示&#xff0c;如192.168.1.1。IPv6是128位的地址&#xff0c;用于提供更多的地址空间&#xff0c;格…

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮&#xff0c;本次基于蓝牙通信的手机遥控智能灯设计功能如下&#xff1a; &#xff08;1&#xff09;用户可以通过蓝牙通信模块的作用下&#xff0c;在手机端遥控切换智能灯不同的工作模式&#xff1b; &#x…