Qt WebEngine基于WebEngineScript注入js脚本

news2024/9/25 1:25:31

在之前的文章中,我们介绍了Qt WebEngine注入js的用法,及runJavaScript()的用法,该方法主要是用在页面加载完成后,为了和网页做一些交互时使用。有时候需要监听网页加载完成的一些状态或信息,则需要网页加载前注入js来实现。这需要用到我们今天要介绍的内容WebEngineScript。

QWebEngineScript

QWebEngineScript支持在加载Web内容期间,在JavaScript引擎中的不同点(由InjectionPoint决定)编程注入所谓的用户脚本。

变量描述
QWebEngineScript::DocumentCreation2该脚本将在文档创建后立即执行。这不适用于任何 DOM 操作。
QWebEngineScript::DocumentReady1一旦 DOM 准备就绪,脚本就会运行。这相当于DOMContentLoadedJavaScript 中的事件触发。
QWebEngineScript::Deferred0该脚本将在页面加载完成时或文档准备就绪后 500 毫秒运行(以先到者为准)。
变量描述
QWebEngineScript::MainWorld0页面的 Web 内容所使用的环境。在某些情况下,它可以用于向 Web 内容公开自定义功能。
QWebEngineScript::ApplicationWorld1用于用 JavaScript 实现的应用程序级功能的默认隔离世界。
QWebEngineScript::UserWorld2如果应用程序未使用更多环境,则用户设置脚本使用的第一个隔离环境。根据经验,如果向应用程序用户公开该功能,则每个单独的脚本可能都应该有自己的隔离环境。

代码说明

    QWebEngineScript script;
    script.setWorldId(QWebEngineScript::MainWorld);
    script.setInjectionPoint(QWebEngineScript::DocumentCreation);
    script.setRunsOnSubFrames(true);
    script.setSourceCode("alert(11111111111)");

    QWebEngineView *view  = new QWebEngineView(this->centralWidget());
    view->page()->scripts().insert(script);
    view->resize(this->width(), this->height());
    view->setUrl(QUrl("https://www.baidu.com/"));

该代码在程序加载之前弹窗提示,由于弹窗是模态阻塞的,所以页面是还没显示的,点OK之后页面就正常显示了。

WebEngineScript

WebEngineScript是QML中的用法,和QWebEngineScript类似。实现代码如下

    WebEngineView {
        id: webview
        anchors.fill: parent
        url: "https://www.bilibili.com/"

        Component.onCompleted: {
            console.log("onCompleted")
            var script = WebEngine.script()
            script.injectionPoint = WebEngineScript.DocumentCreation
            script.worldId = WebEngineScript.MainWorld
            script.sourceCode = "alert(222222222222)"
            webview.userScripts.insert(script)
        }
    }

在WebEngineView组件创建完成是注入js,因为我们要在页面加载完成之前注入,所以不用等到loading完成的时候注入。这个代码的效果和上面是一样的,也是页面加载完成之前弹窗提示。

应用

该用法主要用于拦截页面某些请求的时候使用,由于QWebEngineUrlRequestInterceptor拦截器只能获取到url,无法获取到请求头和body,所以只能通过js脚本进行拦截获取,使用页面加载前注入js的方式使得全局生效。不过后续的Qt版本也逐步在放开拦截的内容,Qt6.5QWebEngineUrlRequestInterceptor支持获取请求头,Qt6.7支持获取body,如果能够使用最新的Qt版本,那会方便很多。

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

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

相关文章

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240802

[toc] 正文 最大最小值 import math import sys# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.a int(input()) b int(input()) c int(input()) d int(input())mylist [] mylist.append(a) mylist.app…

如何写好提示词?《Midjourney常用关键词大全》-附关键词文件

​ Midjourney如何写好提示词从而生成高质量图片? 并且随心所欲生成各种风格的图片? 这是一份关于Midjourney常用关键词的文件: 风格形式/摄影构图/灯光材质/渲染方式/常见设备/常见元素等不同类别, 关键词分门别类&#xff0…

从PyTorch官方的一篇教程说开去(6.2 - 张量 tensor 矩阵运算等)

您的进步和反馈是我写作最大的动力,小伙伴来个三连呗!共勉~ 话不多说,书接上文,需要温习的小伙伴请移步 - 从PyTorch官方的一篇教程说开去(6.1 - 张量 tensor 基本操作)-CSDN博客 借图镇楼 - 1 - 矩阵乘…

【面经】 HR面试套路一览 | 10条面试要点总结

博客主页:Duck Bro 博客主页 关注博主,后期持续更新系列文章 如果有错误感谢请大家批评指出,及时修改 感谢大家点赞👍收藏⭐评论✍ 面经总结 目录 面经总结前言1. 期望薪资2. 关于加班的问题3. 平时是如何学习的(学…

光电测径仪和激光测径仪的区别

光电测径仪和激光测径仪都是用于测量物体直径的精密仪器,它们在工作原理、测量范围、精度、适用场景等方面有所不同。光电测径仪通常使用CCD光电传感器来检测通过物体的光强度变化,而激光测径仪则使用激光作为测量信号,通过发射激光束并接收反…

IT服务质量管理攻略(至简)

质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容,三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划,实施质量控制、质量保证和质量改进活动,确保IT服务满足服务级别协议的要求,最终获得用户…

案例分享-国外UI设计界面赏析

国外UI设计倾向于简洁的布局和清晰的排版,减少视觉干扰,提升用户体验。通过合理的色彩搭配和图标设计,营造舒适愉悦的使用氛围。 设计师不拘泥于传统框架,勇于尝试新元素和理念,使界面独特有趣。同时,强调以…

班美净创始人钟书兰 引领美业新潮流,铸就美丽传奇

在竞争激烈的中国美业市场中,一位杰出的女性创业者凭借其独特的眼光、创新的理念和坚定的决心,开辟出了一片属于自己的辉煌天地。钟书兰,作为班美净的创始人,正以其卓越的领导力和对美的执着追求,在问题性皮肤管理领域…

上网行为监控是如何监控的,能监控到哪些内容,是否合法?

上网行为监控已成为许多企业和机构保障信息安全、提高工作效率的重要手段。 那么,上网行为监控是如何实现的? 它能监控到哪些内容? 这一行为在法律上是否合法? 本文将围绕这些问题展开探讨。 上网行为监控是如何监控的&#x…

CNAS认可认证!

在中国,CNAS(中国合格评定国家认可委员会)认可认证作为质量管理与国际接轨的重要标志,不仅促进了国内检测、校准和检验实验室的技术能力提升,还极大地增强了我国检验检测服务行业的国际竞争力。本文将从CNAS认可认证的…

Lombok的坑:VUE通过ajax.post请求向spring后台传参,部分属性接收不到。

一、问题:VUE通过ajax.post请求向spring后台传参,bAppId属性接收不到,其他的值均正常接收 实体类定义: VUE代码: JAVA代码: 二、原因 实体类使用lombok.Data的Data注解生成get/set,针对首字母小…

Java集合知识点

一、集合类及其特点 在程序设计中,一个重要的组成部分就是如何有效地组织和表示数据通常,我们把用于存储和管理数据的实体称为数据结构而把一组元素按照一定的数据结构进行存储和管理的容器。就称为集合。通过数据结构,我们可以实现不同特性…

制程能力指数(CPK)定义、计算方法知识

一、Cpk的定义 Cpk (Process Capability Index )的定义:制程能力指数; Cpk的意义:是制程水平的量化反映,用来表达制程的水平。 制程能力指数:是一种表示制程水平高低的方便方法,其实质作用是反映制程 合…

程序员VS人工智能

随着Chat GPT人工智能大模型的问世,人工智能将成为普遍的工具。 人工智能优点在于"效率高,方便快捷……",吸引了一大群用户。人工智能在未来世界中,占据了不可缺的地事例1 据海南日报报道,为确保考试公平公正&#xff…

跟《经济学人》学英文:2024年08月03日这期 India’s electric-scooter champion goes public

India’s electric-scooter champion goes public It promises to be a wild ride for investors electric-scooter:电瓶车,电动车 wide ride: 充满波折的过程 解释:指经历一个充满波折、刺激或不可预测的过程。通常用来形容冒险或经历的起…

leetcode 958.二叉树的完全性检验

1.题目要求: 给你一棵二叉树的根节点 root ,请你判断这棵树是否是一棵 完全二叉树 。在一棵 完全二叉树 中,除了最后一层外,所有层都被完全填满,并且最后一层中的所有节点都尽可能靠左。最后一层(第 h 层)…

【数据结构】哈希应用-布隆过滤器

目录 1、布隆过滤器的概念 2、布隆过滤器误判率推导 3、代码实现 3.1 Set 3.2 Test 4、布隆过滤器的删除 5、布隆过滤器的应用 1、布隆过滤器的概念 有⼀些场景下⾯,有⼤量数据需要判断是否存在,⽽这些数据不是整形,那么位图就不能使…

【学习笔记】Day 6

一、进度概述 1、《地震勘探原理》第二章 2、“DenseNet” 周报分享 二、详情 1、《地震勘探原理》第二章 注:本来的打算是逐章整理,但是在听老师指导后,明晰了学习目的。故学习方法更改为侧重 “刷” 。不求一遍全弄懂&#xff0c…

实验8-2-4 使用函数实现字符串部分复制

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。 函数接口定义: void strmcpy( char *t, int m, char *s );函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度…

[Vue]Vue3从入门到精通-综合案例分析

一.Vue是什么: 概念:Vue是一个用于构建用户界面的渐进式的框架 以下的内容是自里向外的 声明式渲染(Vuejs核心包)组件系统(Vuejs核心包)客户端路由VueRouter大规模状态管理Vuex构建工具Webpack/Vite Vue的两种使用方式: Vue核心包开发-&…