在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页面交互相关推荐

  1. 原生webview内核对于H5页面渲染兼容性

    背景 首先,小生从事于H5游戏开发,目前工作内容主要是开发指定的H5游戏嵌入到app包里面(比如:直播间里的小游戏).不可避免需要与原生开发进行频繁的人际交互和代码交互,特别是对于一些安卓低端机的适配 ...

  2. chromium浏览器_全新Edge浏览器上线,Chromium内核,可通过Windows Update更新

    尽管微软的Office和Windows 10势头良好,但为了替换旧的IE浏览器,Microsoft大力开发的Edge却未见起色. 所以为了吸引更多用户使用Edge浏览器,Microsoft决定对其进行 ...

  3. 微软宣布 Edge 浏览器将切换至 Chromium 内核

    简述 据微软官方 blog的消息,windows 的默认浏览器 Edge将切换内核至 Chromium,并且微软将秉承开源精神,在未来更多的为 Chromium项目贡献代码. 微软具体说了什么? 原文 ...

  4. 简述php和web交互过程,PHP与Web页面交互操作实例分析

    PHP与Web页面交互操作实例分析,表单,数组,参数,字符串,属性 PHP与Web页面交互操作实例分析 易采站长站,站长之家为您整理了PHP与Web页面交互操作实例分析的相关内容. 本文实例讲述了PH ...

  5. Chromium 内核新款 Edge 浏览器对比评测,微软找回面子全靠它了

    近日微软在官网终于放出了基于 Chromium 内核打造的新款 Edge 浏览器,感兴趣的朋友可以"点击此处"进行下载.此前,有关微软将使用 Chrome浏览器内核打造全新 Edg ...

  6. Chromium内核原理之网络栈HTTP Cache

    <Chromium内核原理之blink内核工作解密> <Chromium内核原理之多进程架构> <Chromium内核原理之进程间通信(IPC)> <Chro ...

  7. 苹果春季发布会已开启直播;滴滴回应网约车司机被害​;微软Chromium内核浏览器曝光 | 极客头条...

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 滴 ...

  8. 安卓修复已遭在野利用的内核 0day 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌安卓在2021年11月安全更新共修复了39个漏洞,其中18个位于框架和系统组件中,18个位于内核和供应商组件中. 安卓安全更新修复了一个0d ...

  9. 浏览器(2):自制Chromium内核浏览器,自动统计CSDN社区打卡记录

    自研.掌握核心科技?这我可不敢吹,我老老实实说我用了个Chromium内核组件. 为了统计一些数据,一条条复制粘贴肯定是够累的.用爬虫吧,自己还不精通,而且现在好多数据都需要登录才能请求,或者有些需要 ...

最新文章

  1. 传统的6d位姿估计fangfa1_基于改进的点对特征的6D位姿估计
  2. C# Application.DoEvents() 处理队列消息,防界面假死。
  3. CF24D Broken robot | DP 高斯消元
  4. Maven的scope详解
  5. ListView控件的弧形设计
  6. binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常
  7. pycharm和mysql_数据库 mysql 和 pycharm交互
  8. FreeRTOS的内存管理
  9. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(一)
  10. Js获取或计算时间的相关操作
  11. 机器学习之 决策树(Decision Tree)
  12. VMware ESXi客户端连接控制台时提示VMRC控制台连接已断开...正在尝试重新连接的解决方法...
  13. C++定时器和时间轮
  14. mysql主从配置(超简单)
  15. VP9与H.265的6个不同点
  16. con和com开头单词规律_com与con 前缀的单词
  17. Chrome浏览器使用AdGuard去除百度热搜
  18. 公有云NAT 网关比较
  19. 面试时不能讲的跳槽理由有哪些
  20. spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during v

热门文章

  1. 工作那些事儿(12)- 缓存
  2. oracle你如何重置序列号,oracle sequence语句重置方介绍
  3. ADC和DAC中多通道的含义
  4. Xilinx Select IO的介绍
  5. 垃圾邮件过滤 php,垃圾邮件过滤功能
  6. centos下忘记mysql密码_CentOS下忘记mysql密码的解决办法
  7. python共享内存和分布式实现异步加载数据
  8. 神经网络的设计与分析之概述
  9. 人人都能看懂LSTM
  10. Windows不能在本地计算机启动MongoDB,错误代码 100