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++的,个人爱好,写得业余,各位见笑了!
QT5利用chromium内核与HTML页面交互的更多相关文章
- 记Outlook插件与Web页面交互的各种坑 (含c# HttpWebRequest 连接https 的完美解决方法)
1) 方案一, 使用Web Service 基础功能没问题, 只是在连接https (ssh) 网站时, 需要针对https进行开发 (即http 和https 生成两套接口, 不太容易统一 ). ...
- 前端性能优化之利用 Chrome Dev Tools 进行页面性能分析
背景 我们经常使用 Chrome Dev Tools 来开发调试,但是很少知道怎么利用它来分析页面性能,这篇文章,我将详细说明怎样利用 Chrome Dev Tools 进行页面性能分析及性能报告数据 ...
- Qt学习笔记(2)-利用StackWidget实现选项卡式页面
学习笔记第二篇,利用Qt实现选项卡式的页面,效果如图1.1-图1.3所示.程序实现的功能是通过点击状态栏实现不同页面的切换,实际上Qt中自带有Tab选项卡式的控件,本文利用StackWidge实现类似 ...
- linux内存(三)内核与用户空间交互
来自网址http://www.kerneltravel.net/jiaoliu/005.htm 用户程序和内核的信息交换是双向的,也就是说既可以主动从用户空间向内核空间发送信息,也可以从内核空间向用户 ...
- jquery实现页面交互的几个小例子
翻看了以前留下的笔记,发现自己竟然做过这么多的页面交互效果,没有使用原生js,全是通过jquery实现的,于是把他们整理下来,附上表现效果图及源代码 1 业务应用:授权商品组和删除商品组 本质:复选框 ...
- 利用Chrome插件向指定页面植入js,劫持 XSS
资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...
- 利用curl并发来提高页面访问速度
在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个.顺序访问,假如有3个接口,每个接口耗时500毫 秒那么我们三个接口就要花费1500毫秒了,这个问题太头 ...
- (基础篇)PHP与Web页面交互
PHP与Web页面交互是实现PHP网站与用户交互的重要手段.在PHP中提供了两种与Web页面交互的方法,一种是通过Web表单提交数据,另一种是通过URL参数传递. 这里我们将详细讲解表单的相关知识,为 ...
- 利用Bootstrap框架制作查询页面的界面
UI设计实战篇——利用Bootstrap框架制作查询页面的界面 Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺点是定制了界面,调整的余地不是太 ...
随机推荐
- 理解Maven中的SNAPSHOT版本和正式版本
Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- JavaScript中fn()和return fn()
看博客时,注意到return的重要性 参考:http://www.cnblogs.com/raoyunxiao/p/5644032.html 看似反常的例子: var i = 0; function ...
- 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 隐马尔科夫模型python实现简单拼音输入法
在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...
- lua 学习笔记(1)
一.lua函数赋值与函数调用 在lua中函数名也是作为一种变量出现的,即函数和所有其他值一样都是匿名的,当要使用某个函数时,需要将该函数赋值给一个变量,这样在函数块的其他地方就可以通过 ...
- dubbox微服务实例及引发的“血案”
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...
- Opserver开源的服务器监控系统(ASP.NET)
Opserver是Stack Exchange下的一个开源监控系统,系统本身由C#语言开发的ASP.NET(MVC)应用程序,无需任何复杂的应用配置,入门很快.下载地址:https://github. ...
- MAC下 mysql不能插入中文和中文乱码的问题总结
MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...
- ZKWeb网页框架1.1正式发布
发行日志 https://github.com/zkweb-framework/ZKWeb/blob/master/ReleaseNotes/ReleaseNote.1.1.md 主要改动 添加EFC ...