Qt实现简易的浏览器

2023-11-19

一、Qt的webenginewidgets模块和MSVC2017编译环境的配置

  1. webenginewidgets模块
    该模块需要在安装Qt时勾选Qt WebEngine。
    在这里插入图片描述

  2. MSVC2017编译环境的配置
    这里的MSVC选2017还是2015,根据自己Qt版本而定;我的Qt版本是5.14.2,支持MSVC2017或2019
    在这里插入图片描述

  3. 需要安装对应版本的VIsual Studio,如果你上一步选的是MSVC2015,那就去安装VS2015,
    我这里选择的MSVC2017,所以需要安装VS2017或者VS2019。

  4. 在你的Qt项目中配置kit
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、Qt简易浏览器的实现

注意点:

  1. 在pro文件中引入webenginewidgets模块,下面就是和使用其他控件一样玩就好了。

    QT += core gui webenginewidgets

  2. 利用QWebEngineView类,在窗口中嵌入web页面
    但是直接用这个类创建对象,你会发现无法点击页面中的链接跳转到二级网页,这是因为QWebEngineView这个类,本身并没有对链接点击后的二级网页做加载操作,所以,我们需要重写类继承QWebEngineView类,进行函数覆盖,实现对二级网页的加载。

mywebengineview.h

#ifndef MYWEBENGINEVIEW_H
#define MYWEBENGINEVIEW_H

#include <QWebEngineView>

class MyWebEngineView : public QWebEngineView
{
    Q_OBJECT
public:
    explicit MyWebEngineView(QWidget* parent = Q_NULLPTR);

protected:
    //函数覆盖
    QWebEngineView *createWindow(QWebEnginePage::WebWindowType type);

public slots:
    void slotLinkHovered(const QString &);

private:
    //保存鼠标悬停的连接
    QUrl newLink;
};

#endif // MYWEBENGINEVIEW_H

mywebengineview.cpp

#include "mywebengineview.h"

MyWebEngineView::MyWebEngineView(QWidget* parent) : QWebEngineView(parent){
    connect(this->page(), &QWebEnginePage::linkHovered, this, &MyWebEngineView::slotLinkHovered);
}

QWebEngineView *MyWebEngineView::createWindow(QWebEnginePage::WebWindowType){
    //链接被点击时,会自动调用
    //但是由于基类QWebEngineView中此函数并没有干事,所以在此重写进行函数覆盖(多态)
    this->load(newLink);
    return nullptr;
}

void MyWebEngineView::slotLinkHovered(const QString &url){
    this->newLink.setUrl(url);
}

  1. 对窗口做优化,加入上一级、下一级网页按钮,加入地址框,以及加载按钮,将其与web页面一起嵌入到窗口中。
    widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QWebEngineView>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <mywebengineview.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QWebEngineView* myWeb;
    QVBoxLayout* myVLayout;
    QHBoxLayout* myHLayout;

public slots:
    void slotBtnAccess();
    void slotBtnBack();
    void slotBtnNext();
    void slotSetLineEditShow(const QUrl&);

};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){
    ui->setupUi(this);
    this->setWindowTitle("Jerich-Browser");
    myWeb = new MyWebEngineView(this); //基类指针指向派生类对象
    myVLayout = new QVBoxLayout(this);
    myHLayout = new QHBoxLayout(this);
    //设置控件大小
    ui->lineEdit_addr->setFixedHeight(31);
    ui->btnAccess->setFixedSize(31, 31);
    ui->btnBack->setFixedSize(31, 31);
    ui->btnNext->setFixedSize(31, 31);
    //加入布局
    myHLayout->addWidget(ui->btnBack);
    myHLayout->addWidget(ui->btnNext);
    myHLayout->addWidget(ui->lineEdit_addr);
    myHLayout->addWidget(ui->btnAccess);
    myVLayout->addLayout(myHLayout);
    myVLayout->addWidget(myWeb);
    myVLayout->setMargin(1);
    //启动时加载网页
    myWeb->load(QUrl("https://www.baidu.com/"));

    connect(ui->btnAccess, &QPushButton::clicked, this, &Widget::slotBtnAccess);
    connect(ui->btnBack, &QPushButton::clicked, this, &Widget::slotBtnBack);
    connect(ui->btnNext, &QPushButton::clicked, this, &Widget::slotBtnNext);
    connect(myWeb, &MyWebEngineView::urlChanged, this, &Widget::slotSetLineEditShow);
}

Widget::~Widget(){
    delete myHLayout;
    delete myVLayout;
    delete myWeb;
    delete ui;
}

void Widget::slotBtnAccess(){
    myWeb->load(QUrl(ui->lineEdit_addr->text()));
}

void Widget::slotBtnBack(){
    myWeb->back();
}

void Widget::slotBtnNext(){
    myWeb->forward();
}

void Widget::slotSetLineEditShow(const QUrl &url){
    ui->lineEdit_addr->setText(url.toString());
    ui->lineEdit_addr->setCursorPosition(0);
}
  1. 效果图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt实现简易的浏览器 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良

随机推荐

  • 解决vue路由跳转到同一页面的刷新问题

    问题描述 当我使用路由跳转页面时 如果页面跳转是同一个路由 传递的参数不同时 页面不刷新 如下图 待收定金和待收首款其实跳转的是同一个组件 只是他们传递的参数不同而已 当我使用路由进行跳转时 我发现第一次是可以正确跳转的 比如我当前在其他页
  • qt中获取窗口位置和大小

    窗口左上角的位置 含边框 qDebug lt lt this gt frameGeometry x lt lt this gt frameGeometry y lt lt 1 qDebug lt lt this gt x lt lt thi
  • Ubuntu系统下常用的新建、删除、拷贝文件命令

    常用新建 删除 拷贝命令 mkdir 目录名 新建一个文件夹 文件夹在Linux系统中叫做 目录 touch 文件名 新建一个空文件 rmdir 目录名 删除一个空文件夹 文件夹里有内容则不可用 rm rf 非空目录名 删除一个包含文件的文
  • 【C语言】_4.数组

    目录 1 一维数组 2 二维数组 3 数组越界 4 数组作为函数参数 正文 1 一维数组 1 1 数组的创建 1 数组的概念 数组是一组相同类型元素的集合 2 数组的创建方式 type t arr name const n 即数组元素类型
  • AMD yes!拿下Meta后发布新芯片,FP64性能是A100 4.9倍,面向高性能计算和机器学习...

    明敏 发自 凹非寺量子位 报道 公众号 QbitAI AMD造势已久 面向高性能计算的MI200 终于来了 在拿下元宇宙大客户Meta后 AMD乘势而上官宣一系列新芯片 其中就包括这张不断有消息曝出的计算加速卡 它采用6nm工艺 拥有580
  • 第15课 微信小程序behavior组件间的数据共享:

    第15课 微信小程序behavior组件间的数据共享 先看看目录结构 我们先编写一下两my behavior的代码 这里是my behavior js的代码 behavior内还可以嵌套引入behavior my behavior js 引
  • 嵌入式学习:stm32学习路线推荐之思维导图

    从9月1日开始学习STM32后 对于STM32的一些个人总结 1 对于STM32和51的区别 对于 STM32来说 基本的大概都和51单片的内容相似 但是由于STM的引脚和寄存器的数量较多 所以需要一个更加完善的管理机制 导致了 时钟 的产
  • Caused by: org.attoparser.ParseException: Error resolving template [index], template might not exist

    仿牛客论坛 th replace index header 报错 index html中 th fragment header register html中 th replace index header 主要报错是两个 org thyme
  • 递归算法——八皇后问题 python

    研究了一下午的八皇后算法 可算是搞明白了 为了避免以后忘记 还是写个博客吧 可能会跟其他文章有相似之处 最终还是希望能好好学习算法 都是经过自己思考后亲自写的代码 虽然过程比较艰难 我写了很多注释 参考B站视频链接 2021第十二届蓝桥杯青
  • 前端移动Web第四天案例:阿里百秀首页-响应式布局(bootstrap框架)

    阿里百秀首页案例 技术选型 方案 我们采取响应式页面开发方案 技术 bootstrap框架 设计图 本设计图采用 1280px 设计尺寸 1 页面布局分析 2 屏幕划分分析 屏幕缩放发现 中屏幕 和 大屏幕布局 是一致的 因此我们列 定义为
  • Matlab实现蚂蚁群算法(附上多个完整仿真源码)

    蚂蚁群算法是一种模拟自然界中蚂蚁行为的优化算法 其具有全局搜索能力和适应性强的特点 被广泛应用于组合优化问题中 本文将介绍如何使用Matlab实现蚂蚁群算法 文章目录 1 蚂蚁群算法原理 2 Matlab实现蚂蚁群算法 3 代码实现 4 结
  • JS常用方法总结

    数组常用的方法 方法 语法 描述 增加方法 splice arr splice 起始下标 长度 添加的元素1 元素2 arr splice 3 0 0 1 xiaolv 从数组中添加或删除元素 push arr push xiaonan v
  • 数据库双服务器系统设计,面向数据库服务器的高可用性系统的设计与实现

    摘要 随着计算机技术的飞速发展 数据库的应用已遍及各行各业 它们往往维系着整个系统的生命 一旦数据库崩溃造成数据丢失或者暂停服务 那将给用户或企业带来不可估量的损失 尤其是银行系统与电子商务交易系统 一些不可预料的故障或停机造成的经济损失可
  • Java内存区域

    Java内存区域 深入理解Java虚拟机 第2版 Java虚拟机在执行Java程序的过程中会把它所管理的内存分为若干个不同的数据区域 Java虚拟机运行时数据区 其中蓝色部分为共享区域 浅色部分为各线程私有 程序计数器 一块较小的区域 可以
  • 每月摘录--2023年4月

    企业 04月07日 阿里云宣布自研大模型 通义千问 开始邀请用户测试体验 4月10日消息 此前3月29日凌晨 腾讯旗下的微信和QQ等业务曾出现崩溃状况 包括微信语音对话 朋友圈 微信支付 以及QQ文件传输 QQ空间和QQ邮箱在内的多个功能无
  • 基于RFID技术的电力计能表仓储管理系统—铨顺宏

    基于RFID技术的电力计能表仓储管理系统 1 应用背景 电力计量中心是电力行业的电能计量检测机构 承担辖区内电能计量器具安全生命周期管理的职能 包括采购 仓储 检测 配送 安装 运行监测等各个环节 随着城网改造和居民一户一表工作的深入进行
  • 数据库课程设计mysql编程_数据库课程设计[完整版].doc

    可编辑版 Word完美格式 HUNAN CITY UNIVERSITY 数据库系统课程设计 设计题目 宿舍管理信息系统 姓 名 学 号 专 业 信息与计算科学 指导教师 20年 12月1日 目 录 TOC o 1 3 h z HYPERLI
  • ctfshow-Log4j复现-log4j复现

    1 买VPS 打开mobax进行ssh连接 开两个终端 一个终端开启监听 另一个终端进入JNDIExploit 1 2 SNAPSHOT jar所在的目录jndiexploit执行下面命令 java jar JNDIExploit 1 2
  • JavaScript基础Day02:流程控制

    文章目录 1 顺序结构 2 分支结构 1 if语句 2 switch语句 3 循环结构 1 while语句 2 do while语句 3 for循环 1 顺序结构 2 分支结构 1 if语句 if 条件表达式 执行语句 if 条件表达式 成
  • Qt实现简易的浏览器

    一 Qt的webenginewidgets模块和MSVC2017编译环境的配置 webenginewidgets模块 该模块需要在安装Qt时勾选Qt WebEngine MSVC2017编译环境的配置 这里的MSVC选2017还是2015