Qt实现浏览器

参考:https://blog.csdn.net/weixin_40355471/article/details/120698537
QT实现浏览器访问网页,使用QWebEngineView
需要添加QT += webenginewidgets
源代码:
重写QWebEngineView类
头文件:

#pragma once

#include <QObject>
#include <QWidget>
#include <QWebEngineView>
#include <qwebenginepage.h>
#include <qurl.h>
#include <QMouseEvent>
#include <QApplication>

/*
解决两个问题:
1.QWebEngineView不支持点击超链接自动跳转,对createWindow处理后可支持跳转;
2、QWebEngineView浏览web时鼠标事件被本身的child接收了,因此浏览网页时获取不了
qt的鼠标事件,这里通过QEvent::ChildPolished安装事件过滤器的方式获取鼠标事件。
*/
class QWebEngineViewRewrite : public QWebEngineView
{
	Q_OBJECT

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

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;
};

源文件:

#include "QWebEngineViewRewrite.h"

QWebEngineViewRewrite::QWebEngineViewRewrite(QWidget* parent) 
	: QWebEngineView(parent)
{
	setAttribute(Qt::WA_DeleteOnClose);
	connect(this->page(), &QWebEnginePage::linkHovered, this, &QWebEngineViewRewrite::slot_LinkHovered);
}

QWebEngineViewRewrite::~QWebEngineViewRewrite()
{
}

QWebEngineView* QWebEngineViewRewrite::createWindow(QWebEnginePage::WebWindowType type)
{
    //加载链接地址
    if (!url_.isEmpty())
    {
        this->load(url_);
        emit QEvent::ChildPolished;//重新加载页面时,手动触发一个ChildPolished事件
    }
    return nullptr;
}

void QWebEngineViewRewrite::slot_LinkHovered(const QString& url)
{
    // 获取视图里面点击的链接地址
    // qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<url;
    url_.setUrl(url);
}

bool QWebEngineViewRewrite::event(QEvent* evt)
{
    //每次新加载URL时手动触发该事件,生成一个QChildEvent
    if (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 QWebEngineViewRewrite::eventFilter(QObject* _obj, QEvent* _event)
{
    foreach(QObject * childObj, mvchildObj)
    {
        if (_obj == childObj)
        {
            if (/*obj == childObj&& */(_event->type() == QEvent::MouseButtonPress || _event->type() == QEvent::MouseButtonDblClick))
            {
                QMouseEvent* MouseEvent = static_cast<QMouseEvent*>(_event);
                int x = MouseEvent->x();
                int y = MouseEvent->y();
                qDebug() << "[" << __FILE__ << "]" << __LINE__ << __FUNCTION__ << " " << x << y;
                return QWebEngineView::eventFilter(_obj, _event);
            }
        }
    }
    return QWebEngineView::eventFilter(_obj, _event);
}

实现类头文件:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_WebWidget.h"

#include <QWebEngineView>
#include "QWebEngineViewRewrite.h"

class WebWidget : public QMainWindow
{
    Q_OBJECT

public:
    WebWidget(QWidget *parent = Q_NULLPTR);

private slots:
    void on_pushButton_clicked();           // 访问
    void on_pushButton_2_clicked();         // 刷新
    void on_pushButton_back_clicked();      // 后退
    void on_pushButton_forward_clicked();   // 前进

private:
    Ui::WebWidgetClass ui; 
    QNetworkAccessManager* manager;

    QWebEngineView* m_webView;
};

实现类源文件:

#include "WebWidget.h"
#include <QNetworkProxyFactory>

WebWidget::WebWidget(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    this->setWindowTitle(QStringLiteral("QWebEngineView浏览器"));
    QNetworkProxyFactory::setUseSystemConfiguration(false);

    m_webView = new QWebEngineViewRewrite(this);
    ui.verticalLayout->addWidget(m_webView); 
    m_webView->load(QString("https://blog.csdn.net/weixin_40355471/article/details/120698537"));
}
//访问
void WebWidget::on_pushButton_clicked()
{
    QString url = ui.lineEdit->text();
    if (!url.isEmpty())
    {
        m_webView->load(url);
    }
}
//刷新
void WebWidget::on_pushButton_2_clicked()
{
    m_webView->reload();
}
//后退
void WebWidget::on_pushButton_back_clicked()
{
    m_webView->back();
}
//前进
void WebWidget::on_pushButton_forward_clicked()
{
    m_webView->forward();
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇树谦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值