QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕竟已经集成在QT中很多年了,各种接口都相当的成熟了,与HTML交互更是封装得相当容易上手,QNetworkAccessManager,QProxy都对外提供了对应的接口让开发者实现自定义。但是最终还是被淘汰掉,与chromium内核相比起来还是要逊色不少,从QT5.4开始官方已经集成chromium,并且会逐渐淘汰掉webkit,最近尝试了一下QT的chromium组件,在QT里面叫QWebEngine,刚开始用除了觉得它快以外,没有觉得其他的优点,例如:1、不支持自定义QNetworkAccessManager 2、无法获取Cookie等等,官方提供的例子也是看得云里雾里的,然后再就是与HTML的交互,HTML无法主动调用chromium定义的SLOT或者Method,只能从QWebEngine发起对HTML的调用,希望更多的接口在后面的版本中能够逐渐开放。
下面来讲一下从QWebEngine调用页面脚本的方法,这里以某宝首页为例:
web=new QWebEngineView();
ui->Main->insertWidget(0,web);//这里是添加到一个StackWidget
ui->Main->setCurrentIndex(0);
connect(web,&QWebEngineView::loadFinished,[=](int){web->page()->runJavaScript("这里是JS脚本");
});
web->load(QUrl("http://www.taobao.com"));
然后执行的JS脚本如下:
KISSY.all("<div id='prompt_msk' style='height:100%;width:100%;background:#000000;position:fixed;top:0px;left:0px;z-index:9999998;opacity:0.3'></div>").appendTo("body");KISSY.all("<div id='prompt_dlg' style='height:150px;width:400px;background:#ffffff;position:fixed;top:100px;left:50%;z-index:9999999;border:3px solid #454545'><div style='background:#888888;border-bottom:1px solid #454545;padding-left:5px;height:30px;line-height:30px;color:#ffffff;'>订单信息提取提示</div><div style='padding:10px;line-height:23px;' id='prompt_dlg_cnt'>正在解析订单数据,请稍等...</div></div>").appendTo("body");KISSY.all("#prompt_dlg").css({left:(KISSY.all(window).width()-KISSY.all("#prompt_dlg").outerWidth())/2});
由于淘宝用的自己的KISSY框架,所以要先对KISSY框架有一定的了解!下面看一下执行之后的结果
下面我们再来看下runJavaScript方法有个回调函数,QWebEngineCallback(const QVariant &),这里我们常识获取一下某个节点的值(这里获取登陆账户的昵称为例)并且返回给QT利用debug输出
通过浏览器F12可以发现,昵称在一个a标签class为login-info-nick的节点里面,KISSY获取的代码为:
KISSY.all('a.login-info-nick').text();
在传值给回调方法JS中不需要return即可,开始我以为要return返回一直是QVariant(Invalid);后来发现不需要return则正常了,QT回调代码:
web->page()->runJavaScript("KISSY.all('a.login-info-nick').text();",[=](const QVariant &v){qDebug()<<v;});
输出结果为:
这里成功接收到JS的结果!
利用这种方法可以在任意的页面执行自己所想要的JS数据请求,同时你还可以自己注入jQuery(官方有例子)
不过最好是利用目标站点自带的JS框架,难免多个框架有冲突,我就把jQuery注入到淘宝网站进行AJAX数据请求,发现怎么都没办法返回请求的数据,相反,我在一般的HTTP网站请求则可以返回数据,异步的也可以返回,但是在淘宝就是不行,换做淘宝自己的KISSY框架请求,则可以正常获取到数据!不知道是不是https的限制,一种方法不行就换另一种对吧,到目前为止我已经成功的获取到登陆账户的订单数据跟物流数据了,数据是JSON格式,但是:QWebEngineCallback对返回数据的大小有限制,我在官方文档里面没找到有说限制大小的地方,但是亲测数据是有大小限制的,我请求的数据大概在40KB,回调直接跳过也不报错,当我把数据清理再回调则发现可以正常返回!所以务必交互数据最精简!
到目前还没发现能够主动从HTML调用QWebEngine的接口,有了解的同学请赐教,谢谢!
我不是做C++的,个人爱好,写得业余,各位见笑了!
转载于:https://www.cnblogs.com/263613093/p/4973089.html
QT5利用chromium内核与HTML页面交互相关推荐
- 原生webview内核对于H5页面渲染兼容性
背景 首先,小生从事于H5游戏开发,目前工作内容主要是开发指定的H5游戏嵌入到app包里面(比如:直播间里的小游戏).不可避免需要与原生开发进行频繁的人际交互和代码交互,特别是对于一些安卓低端机的适配 ...
- chromium浏览器_全新Edge浏览器上线,Chromium内核,可通过Windows Update更新
尽管微软的Office和Windows 10势头良好,但为了替换旧的IE浏览器,Microsoft大力开发的Edge却未见起色. 所以为了吸引更多用户使用Edge浏览器,Microsoft决定对其进行 ...
- 微软宣布 Edge 浏览器将切换至 Chromium 内核
简述 据微软官方 blog的消息,windows 的默认浏览器 Edge将切换内核至 Chromium,并且微软将秉承开源精神,在未来更多的为 Chromium项目贡献代码. 微软具体说了什么? 原文 ...
- 简述php和web交互过程,PHP与Web页面交互操作实例分析
PHP与Web页面交互操作实例分析,表单,数组,参数,字符串,属性 PHP与Web页面交互操作实例分析 易采站长站,站长之家为您整理了PHP与Web页面交互操作实例分析的相关内容. 本文实例讲述了PH ...
- Chromium 内核新款 Edge 浏览器对比评测,微软找回面子全靠它了
近日微软在官网终于放出了基于 Chromium 内核打造的新款 Edge 浏览器,感兴趣的朋友可以"点击此处"进行下载.此前,有关微软将使用 Chrome浏览器内核打造全新 Edg ...
- Chromium内核原理之网络栈HTTP Cache
<Chromium内核原理之blink内核工作解密> <Chromium内核原理之多进程架构> <Chromium内核原理之进程间通信(IPC)> <Chro ...
- 苹果春季发布会已开启直播;滴滴回应网约车司机被害;微软Chromium内核浏览器曝光 | 极客头条...
「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 滴 ...
- 安卓修复已遭在野利用的内核 0day 漏洞
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌安卓在2021年11月安全更新共修复了39个漏洞,其中18个位于框架和系统组件中,18个位于内核和供应商组件中. 安卓安全更新修复了一个0d ...
- 浏览器(2):自制Chromium内核浏览器,自动统计CSDN社区打卡记录
自研.掌握核心科技?这我可不敢吹,我老老实实说我用了个Chromium内核组件. 为了统计一些数据,一条条复制粘贴肯定是够累的.用爬虫吧,自己还不精通,而且现在好多数据都需要登录才能请求,或者有些需要 ...
最新文章
- 传统的6d位姿估计fangfa1_基于改进的点对特征的6D位姿估计
- C# Application.DoEvents() 处理队列消息,防界面假死。
- CF24D Broken robot | DP 高斯消元
- Maven的scope详解
- ListView控件的弧形设计
- binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常
- pycharm和mysql_数据库 mysql 和 pycharm交互
- FreeRTOS的内存管理
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(一)
- Js获取或计算时间的相关操作
- 机器学习之 决策树(Decision Tree)
- VMware ESXi客户端连接控制台时提示VMRC控制台连接已断开...正在尝试重新连接的解决方法...
- C++定时器和时间轮
- mysql主从配置(超简单)
- VP9与H.265的6个不同点
- con和com开头单词规律_com与con 前缀的单词
- Chrome浏览器使用AdGuard去除百度热搜
- 公有云NAT 网关比较
- 面试时不能讲的跳槽理由有哪些
- spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during v