支持访问网页,前进、后退、刷新,点击超链接自动跳转,获取网页鼠标事件,重新编译QWebEngineView库后还可以支持播放mp4等视频;
Qt在debug模式运行有时访问网页很卡,切换release版后访问速度基本正常。

目录

  • 环境说明
  • 源代码
  • 效果图
  • QWebEngineView缺点和优点

环境说明

使用QWebEngineView类实现,qt5.6及以上版本;
qt安装时需要勾选:Qt WebEngine;
由于chrome不支持mingw编译,构建套件只能选择vs的编译器;
pro工程文件添加QT += webenginewidgets

源代码

重写QWebEngineView类,主要实现两个功能:
1、QWebEngineView不支持点击超链接自动跳转,对createWindow处理后可支持跳转;
2、QWebEngineView浏览web时鼠标事件被本身的child接收了,因此浏览网页时获取不了qt的鼠标事件,这里通过QEvent::ChildPolished安装事件过滤器的方式获取鼠标事件。

qwebengineviewchw.h

#ifndef QWEBENGINEVIEWCHW_H
#define QWEBENGINEVIEWCHW_H
#include <QWidget>
#include <QWebEngineView>
#include <qwebenginepage.h>
#include <qurl.h>
#include <QMouseEvent>
#include <QApplication>
class QWebEngineViewChw : public QWebEngineView
{Q_OBJECT
public:explicit QWebEngineViewChw(QWidget *parent = nullptr);~QWebEngineViewChw()override;
protected:QWebEngineView* createWindow(QWebEnginePage::WebWindowType type) override;
private slots:void slot_LinkHovered(const QString& url);
private:QUrl    url_;QVector<QObject * > mvchildObj;
protected:bool event(QEvent* evt)override;bool eventFilter(QObject *obj, QEvent *ev)override;
};
#endif // QWEBENGINEVIEWCHW_H

qwebengineviewchw.cpp

#include "qwebengineviewchw.h"
QWebEngineViewChw::QWebEngineViewChw(QWidget *parent) : QWebEngineView(parent)
{setAttribute(Qt::WA_DeleteOnClose);connect(this->page(), &QWebEnginePage::linkHovered, this, &QWebEngineViewChw::slot_LinkHovered);
}QWebEngineViewChw::~QWebEngineViewChw()
{}QWebEngineView *QWebEngineViewChw::createWindow(QWebEnginePage::WebWindowType type)
{//加载链接地址if(!url_.isEmpty()){this->load(url_);emit QEvent::ChildPolished;//重新加载页面时,手动触发一个ChildPolished事件}
//    return this;return nullptr;
}void QWebEngineViewChw::slot_LinkHovered(const QString &url)
{//获取视图里面点击的链接地址
//    qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<url;url_.setUrl(url);
}bool QWebEngineViewChw::event(QEvent *evt)
{//每次新加载URL时手动触发该事件,生成一个QChildEventif (evt->type() == QEvent::ChildPolished){qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" ";QChildEvent *child_ev = static_cast<QChildEvent*>(evt);QObject *childObj = child_ev->child();mvchildObj.append(childObj);if (childObj){childObj->installEventFilter(this);}}return QWebEngineView::event(evt);
}bool QWebEngineViewChw::eventFilter(QObject *obj, QEvent *ev)
{foreach(QObject *childObj,mvchildObj){if (obj == childObj){if (/*obj == childObj&& */(ev->type() == QEvent::MouseButtonPress|| ev->type() == QEvent::MouseButtonDblClick)){QMouseEvent *MouseEvent = static_cast<QMouseEvent *>(ev);int x = MouseEvent->x();int y = MouseEvent->y();qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<x <<y;return QWebEngineView::eventFilter(obj, ev);}}}return QWebEngineView::eventFilter(obj, ev);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QWebEngineView>
#include "qwebengineviewchw.h"
namespace Ui {class MainWindow;
}
class MainWindow : public QMainWindow
{Q_OBJECT
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();
private slots:void on_pushButton_clicked();//访问void on_pushButton_2_clicked();//刷新void on_pushButton_back_clicked();//后退void on_pushButton_forward_clicked();//前进
private:Ui::MainWindow *ui;QWebEngineViewChw *m_webView;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkProxyFactory>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle(QStringLiteral("QWebEngineView浏览器"));
//    qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "7777");QNetworkProxyFactory::setUseSystemConfiguration(false);m_webView = new QWebEngineViewChw(this);ui->verticalLayout->addWidget(m_webView);
}MainWindow::~MainWindow()
{delete ui;
}
//访问
void MainWindow::on_pushButton_clicked()
{QString url = ui->lineEdit->text();if (!url.isEmpty()){m_webView->load(url);}
}
//刷新
void MainWindow::on_pushButton_2_clicked()
{m_webView->reload();
}
//后退
void MainWindow::on_pushButton_back_clicked()
{m_webView->back();
}
//前进
void MainWindow::on_pushButton_forward_clicked()
{m_webView->forward();
}

效果图

QWebEngineView缺点和优点

1、由于QWebEngineView没有视频解码器,无法播放mp4等视频,需要重新编译QWebEngineView库,编译过程比较复杂不建议自己尝试,可以在网上下载别人编译好的,编译库和使用库的qt版本、vs版本、位数等要保持一致;

2、点击链接不跳转,重写QWebEngineView类,自动识别鼠标放在链接上面的URL地址,但有些网页链接鼠标放上不显示URL地址,这种情况无法跳转,存在一定BUG;

总结一下:简单的浏览器可以使用QWebEngineView,比较容易实现,但是稳定性和兼容性差一些,后续会研究CEF(Chromium嵌入式框架) ,并嵌入到qt程序实现浏览器功能。

QT实现浏览器访问网页,使用QWebEngineView相关推荐

  1. 课时3.浏览器访问网页原理(理解)

    浏览器访问网页原理(理解) 第一次打开IE6,发现系统自动生成了一个文件夹,所以我们可以得出这个文件夹必然和IE6有一定的关系 先删除Internet Cache下的所有文件夹,然后通过IE6打开百度 ...

  2. 【避坑 超详细】Ubuntu使用python的selenium以及chrome模拟真实浏览器访问网页

    在Ubuntu系统上使用python的selenium,另外加上chrome和chromedriver,用于模拟浏览器访问网页. 下面教程在阿里云的Ubuntu 14.04 64位测试成功,其他lin ...

  3. Qt利用JavaScript访问网页元素(百度博客下载例子)

    Qt利用JavaScript访问网页元素(百度博客下载例子)   本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业 ...

  4. vb调用本地html,在VB中调用浏览器访问网页

    调用浏览器访问某一网址(页)是软件中常见的功能.本文总结在VB编程中调用浏览器访问网页的三种方法: Shell 函数. ShellExecute API 函数和 Automation 对象技术. Sh ...

  5. Charles开启抓包后,浏览器访问网页提示不信任的证书

    之前使用charles抓包好好地,突然有一天浏览器访问网页提示不信任的证书,就查找原因,按照以下步骤即可解决. 找到help->SSL Proxying->Install Charles ...

  6. 爬虫小白系列01期: 从李白杜甫,来看爬虫本质 、 浏览器访问网页原理 、 请求头的概念

    众所周知,爬虫的本质是,模拟浏览器打开网页,获取网页中我们需要的那部分数据. 那首先我们应该清楚,普通一般浏览器打开网页的流程和原理是怎样的? 根据生活经验,我们使用浏览器打开网页的步骤一般是这样的 ...

  7. Java中模拟浏览器访问网页(三)

    Java中模拟浏览器访问网页(三) 转载:https://blog.csdn.net/qq122627018/article/details/51473150 一.前言 看完上一节中浏览器访问网页的行 ...

  8. 浏览器访问网页时如何去广告

    我们在访问网页时,网页上会附带很多广告或者推送,如何避免这些烦人的东西呢? 以360极速浏览器为例,360浏览器的操作也类似. 1. 把360极速浏览器的搜索引擎改为百度,并且把主页设置为百度,这就可 ...

  9. Python爬虫入门6:模拟浏览器访问网页的http报文体压缩传输

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面章节中介绍了使用urllib包的request模块访问网页的方法.但上节特 ...

最新文章

  1. linux 程序自启
  2. 每次没事情的时候都去学校的活动室或者武术室
  3. 细说C#多线程那些事 - 线程同步和多线程优先级
  4. Java使用UDP聊天程序
  5. linux上如何设置ssh免密登陆
  6. [PAT乙级]1033 旧键盘打字(getline()读入)
  7. mysql xp系统时间_mysql时间类型year
  8. 领导者的资质——学习笔记(3):领导者的十项职责
  9. [深度学习TF2][RNN-NPL数据预处理] -Tokenizer函数
  10. python是干什么用的-使用Python究竟可以做什么?下面是Python的3个主要应用
  11. tkinter 文本框 值改变_【动图详解】PPT中文本框的使用方法,初学者必看!
  12. win10忘记密码_win10带有密码压缩包的破解方法
  13. java keytool 下载_常用的Java Keytool Keystore命令
  14. Eureka是干什么的?
  15. scala成长之路(1)基本语法和数据类型
  16. Excel笔记(持续更新)
  17. 如何新建一个看不见的文件夹(我们的游戏都在里头)
  18. 技术沙龙|这期我们聊聊软件工程师的区块链升级挑战(杭州)
  19. 蓝桥ROS之f1tenth案例学习与调试(成功)
  20. 蓝牙路由器是怎么回事?

热门文章

  1. eos bp节点 超级节点搭建
  2. 谷歌浏览器自定义快捷搜索引擎
  3. 计算机中浮点数的表示及正负数小数的反码补码
  4. 12 JAVA编程思想——集合的类型
  5. C语言实现简单的电梯控制系统
  6. 一个男人最高的品味是他选择的女人
  7. 目标检测论文解读复现之五:改进YOLOv5的SAR图像舰船目标检测
  8. SAS常用基础代码例子-数据描述性分析
  9. 小技巧|CSS如何实现文字两端对齐
  10. [四连测(三)]篱笆