Qt实现简易的浏览器

3 篇文章 0 订阅

一、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. 效果图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值