本篇简介

本篇的小目标:

  • 借助Qt自家的QWebEngineView实现浏览器的基本功能:输入地址访问页面和刷新页面
  • 定制QWebEngineView的ContextMenu,实现Inspector调试界面的调用

QWebEngineView基础

首先在所创建项目的.pro配置中添加webenginewidgets模块:

QT += webenginewidgets

然后在主窗口初始化时创建QWebEngineView对象:

1 m_webView = new QWebEngineView(this);
2 QStackedLayout* layout = new QStackedLayout(ui->frame);
3 ui->frame->setLayout(layout);
4 layout->addWidget(m_webView);
界面上有一个输入地址的控件(adressEdit)和两个按钮——访问按钮(btnGo)和刷新按钮(btnRefresh),使用QWebEngineView的load和reload方法,可以很方便地实现这两个按钮的功能:
 1 connect(ui->btnGo, &QPushButton::clicked, this, [this]() {
2 QString url = ui->addressEdit->text();
3 if (!url.isEmpty())
4 {
5 m_webView->load(url);
6 }
7 });
8 connect(ui->btnRefresh, &QPushButton::clicked, this, [this]() {
9 m_webView->reload();
10 });

这样一个简单的浏览器就实现好了,访问一下百度看看效果:

实现Inspector调试界面

在谷歌浏览器中按一下F12可以调出功能强大的调试界面,QWebEngine中也包含了这个功能。这里我们稍微简化一下,改成在页面上点击右键并选择"Inspect",即可呼出调试界面。

首先需要设置一个环境变量QTWEBENGINE_REMOTE_DEBUGGING来指定调试页面所使用的端口号。例如,将7777端口设为调试端口,可在主窗口初始化方法的最开头添加下面的代码:

qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "7777");

如果设置成功,在终端上会打印如下提示:

Remote debugging server started successfully. Try pointing a Chromium-based browser to http://127.0.0.1:7777

然后实现一个QDialog作为Inspector的界面,里面内嵌另一个QWebEngineView,这个view专门用来加载调试页面:

 1 Inspector::Inspector(QWidget *parent) :
2 QDialog(parent),
3 ui(new Ui::Inspector)
4 {
5 ui->setupUi(this);
6
7 connect(ui->btnClose, &QPushButton::clicked, this, [this](){
8 hide();
9 });
10
11 m_webView = new QWebEngineView(this);
12 QStackedLayout* layout = new QStackedLayout(ui->frame);
13 ui->frame->setLayout(layout);
14 layout->addWidget(m_webView);
15 m_webView->load(QUrl("http://localhost:7777"));
16 QDialog::show();
17 }

因为这里的关闭按钮实际上只是把界面隐藏起来了,所以重载一下show方法,保证每次打开时调试的页面是最新的:

1 void Inspector::show()
2 {
3 m_webView->reload();
4 QDialog::show();
5 }
最后在主窗口初始化时修改一下QWebEngineViewContextMenu设置。因为QWebEngineView继承了QWidget,所以可以使用与处理QWidget类似的方式定制ContextMenu:
 1 m_webView->setContextMenuPolicy(Qt::CustomContextMenu);
2 m_inspector = NULL;
3 connect(m_webView, &QWidget::customContextMenuRequested, this, [this]() {
4 QMenu* menu = new QMenu(this);
5 QAction* action = menu->addAction("Inspect");
6 connect(action, &QAction::triggered, this, [this](){
7 if(m_inspector == NULL)
8 {
9 m_inspector = new Inspector(this);
10 }
11 else
12 {
13 m_inspector->show();
14 }
15 });
16 menu->exec(QCursor::pos());
17 });

这样一个简单的Inspector就实现完成了,试试效果:

 
 

Qt 嵌入浏览器 QWebEngineView实现浏览器基本功能的更多相关文章

  1. 谷歌Chrome浏览器开发者工具的基础功能

    上一篇我们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工具中最有用的面板Sources.Sources面板几乎是最常用到的Chrome功能面板,也是解决一般问题的主要 ...

  2. 模拟实现兼容低版本IE浏览器的原生bind()函数功能

    模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){   Function.prototype.bind=function( ...

  3. H5手机移动端调起浏览器(qq浏览器,uc浏览器)自带分享功能实例

    H5手机移动端调起浏览器(qq浏览器,uc浏览器)自带分享功能实例 (转载:https://blog.csdn.net/weixin_38787928/article/details/86741227 ...

  4. 转:HTML5页面如何在手机端浏览器调用相机、相册功能

    HTML5页面如何在手机端浏览器调用相机.相册功能 开发微信端浏览器访问的HTML5的页面,页面中有一个<input id="input" type="file&q ...

  5. zeroclipboard实现多浏览器复制到粘贴板功能

    zeroclipboard实现多浏览器复制到粘贴板功能(单个复制按钮和多个复制按钮) 为了更好的用户体验,现在很多网站中文本框的内容只需要点击复制按钮这样就能把内容复制到粘贴板了:出于兼容性的考虑,基 ...

  6. 在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能

    在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能 https://www.jianshu.com/p/27ee7df4ccc1

  7. 使用response将html拼接页面写到当前浏览器端完成自动提交功能

    /** * 准备中间页面所需参数 * add by linyan  2014-9-22 * @param url * @param params * @param charset * @return ...

  8. 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?

    浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...

  9. mac 下基于firebreath 开发多浏览器支持的浏览器插件

    mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...

  10. 用PC浏览器模拟手机浏览器(一):无扩展版

    想浏览手机版,打开对应网址却跳转到PC版?怎么办? 下面咱们来说下在只是安装了浏览器,无需其他安装操作的情况下来怎么用PC浏览器模拟手机浏览器,然后访问手机站点. 浏览器众多,IE系列的咱就不考虑了, ...

随机推荐

  1. Spring Boot 自动配置原理深度解析

    在 Spring 生态系统中,Spring Boot 自动配置是实现 "零配置" 开发的核心特性,通过约定大于配置的理念,自动为应用注入所需的基础设施配置.本文从核心注解.底层机制 ...

  2. AI应用实战课学习总结(5)回归分析预测实战

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第5站,一起了解下回归分析是什么 以及 通过回归模型预测电商用户的生命周 ...

  3. MongoDB入门实战教程(8)

    前面我们学习了模型设计中的内嵌模式与引用模式的使用,本篇我们来看看在模型设计中如何套用常见的设计模式来降低设计难度,提高查询效率. 1 MongoDB也有设计模式? 在使用C#/Java等开发语言的时 ...

  4. C#:wpf ui 4.0 是如何实现页面导航的?

    wpf ui 介绍 wpf ui 是一款我比较喜欢的wpf ui界面开源库,目前已经获得了8.5颗stars,还是很受欢迎的: wpf ui在vs中也提供了快速开发模板: 让wpf开发者可以快速进行应 ...

  5. Android 各个模拟器的 链接上Adb 设备管理的方法

    https://blog.csdn.net/weixin_45598506/article/details/107918803?spm=1001.2101.3001.6661.1&utm_me ...

  6. .net 文件上传

    文件上传(页面端) 1.文件上传必须用post提交 2.必须修改表中提交数据时的组织方式,即enctype="multipart/form-data",数据是以分隔符的方式提交的 ...

  7. Excel打开csv乱码问题

    前言程序创建cvs文件,必须blob标识头部,否则会打不开或者乱码 outputStream.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xB ...

  8. 前端开发系列043-基础篇之TypeScript语言特性(三)

    本文简单介绍TypeScript语言中的以下特性: ❏ 解构赋值 ❏ 函数介绍 ❏ 命名空间 一.解构&展开 解构赋值语法使得我们可以将值从数组或者将属性从对象中提取对应的变量中.下面我们将简 ...

  9. openwrt 加上开源库

    因为openwrt 自身带有很多的开源库,所以当你想要增加一个开源库的时候不妨去看一下,openwrt的库 首先在 1 . openwrt/package/项目名称/项目名称/Makefile + 上 ...

  10. 关于 C++软件设计的建议

    简介 RT 参考资料 C++语言的设计与演化 内容 在回答这个问题时,程序员经常把注意力集中在语言特征上:我要不要使用 inline 函数?虚函数?多重继承?单根层次结构?抽象类?重载函数?这种关注根 ...