使用Qt实现一个简易的网页浏览器

该文详细介绍了如何使用Qt库创建一个基本的网页浏览器,包括设置界面布局,添加后退、前进、刷新按钮功能,以及处理地址栏输入和网页加载。通过QWebEngineView来显示网页,并利用信号和槽机制实现按钮功能,同时重写事件和事件过滤函数处理超链接跳转。
摘要由CSDN通过智能技术生成

使用Qt实现一个简易的网页浏览器

实现功能如下

  • 在地址栏中输入地址按下回车跳转
  • 网页后退功能
  • 网页前进功能
  • 网页刷新功能

核心代码

界面设计

	QWidget *centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    QHBoxLayout *buttonLayout = new QHBoxLayout();

    backButton = new QPushButton("<-", this);
    forwardButton = new QPushButton("->", this);
    refreshButton = new QPushButton("Refresh", this);
    goButton = new QPushButton("Go", this);


    buttonLayout->addWidget(backButton);
    buttonLayout->addWidget(forwardButton);
    buttonLayout->addWidget(refreshButton);

    urlLineEdit = new QLineEdit(this);
    urlLineEdit->setPlaceholderText("Enter URL");
    buttonLayout->addWidget(urlLineEdit);
    buttonLayout->addWidget(goButton);

    QMenuBar *menuBar = new QMenuBar(this);
    menuBar->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); // 设置菜单栏大小策略

    // 创建菜单
    QMenu *fileMenu = menuBar->addMenu("File");
    QMenu *editMenu = menuBar->addMenu("Edit");
    QMenu *viewMenu = menuBar->addMenu("View");
    QMenu *helpwMenu = menuBar->addMenu("Help");

    // 创建菜单项
    QAction *newAction = new QAction("New", this);
    QAction *openAction = new QAction("Open", this);
    QAction *saveAction = new QAction("Save", this);
    QAction *cutAction = new QAction("Cut", this);
    QAction *copyAction = new QAction("Copy", this);
    QAction *pasteAction = new QAction("Paste", this);
    QAction *zoomInAction = new QAction("Zoom In", this);
    QAction *zoomOutAction = new QAction("Zoom Out", this);

    // 将菜单项添加到菜单中
    fileMenu->addAction(newAction);
    fileMenu->addAction(openAction);
    fileMenu->addAction(saveAction);
    editMenu->addAction(cutAction);
    editMenu->addAction(copyAction);
    editMenu->addAction(pasteAction);
    viewMenu->addAction(zoomInAction);
    viewMenu->addAction(zoomOutAction);


    webView = new QWebEngineViewRewrite(this);
    layout->addWidget(menuBar);
    layout->addLayout(buttonLayout);
    layout->addWidget(webView);

信号和槽的连接

	connect(backButton, &QPushButton::clicked, webView, &QWebEngineView::back);
    connect(forwardButton, &QPushButton::clicked, webView, &QWebEngineView::forward);
    connect(refreshButton, &QPushButton::clicked, webView, &QWebEngineView::reload);
    connect(webView, &QWebEngineView::loadFinished, this, &BrowserWindow::updateButtons);
    connect(goButton, &QPushButton::clicked, this, &BrowserWindow::handleButtonClicked);

BrowserWindow.h

private slots:
    void updateButtons();
    void loadUrl();
    void handleButtonClicked();
    void handleLinkHovered(const QUrl& url);

private:
    QLineEdit *urlLineEdit;
    QPushButton *backButton;
    QPushButton *forwardButton;
    QPushButton *goButton;
    QPushButton *refreshButton;
    QWebEngineView *webView;
    QUrl m_url;

private:
    Ui::BrowserWindow *ui;

BrowserWindow.cpp

void BrowserWindow::updateButtons()
{
    backButton->setEnabled(webView->history()->canGoBack());
    forwardButton->setEnabled(webView->history()->canGoForward());
}

void BrowserWindow::loadUrl()
{
    QString url = urlLineEdit->text();
        if (!url.isEmpty())
        {
            if (!url.startsWith("http://") && !url.startsWith("https://"))
            {
                url.prepend("http://");
            }
            QUrl webUrl(url);
            webView->setUrl(webUrl);
            connect(webView->page(), &QWebEnginePage::linkHovered, this, &BrowserWindow::handleLinkHovered);
        }
}

void BrowserWindow::handleButtonClicked()
{
    loadUrl();
    updateButtons();
}

void BrowserWindow::handleLinkHovered(const QUrl &url)
{
    //获取超链接
    m_url = url;
    qDebug() << "url:" << m_url;
}

关键的网页超链接跳转功能(核心)

需要重写事件和事件过滤函数

protected:
    QWebEngineView* createWindow(QWebEnginePage::WebWindowType type) override;
private slots:
    void LinkHovered(const QString& url);
private:
    QUrl	url_;
    QVector<QObject* > mvchildObj;
protected:
    bool event(QEvent* evt)override;
    bool eventFilter(QObject* obj, QEvent* ev)override;

最终效果如下图:
效果图

如果有兴趣的话可以下载一下
https://download.csdn.net/download/liutao_1/88003602?spm=1001.2014.3001.5503

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值