Qt | 实现获取网站图标和网页缩放 QWebEngineView

641 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言:

每个网站都有一个Logo图标,它一般显示在网站标题的前面,这个图标文件是可以获取到的。下面介绍了获取图标文件的方法。

QWebEngineView实现的网页内容是可以进行缩放的,下面介绍了听过Ctrl++、Ctrl--和Ctrl+0实现放大、缩小和重置的功能。

获取网站图标文件:

网站的图标可以使用QWebEngineView的iconUrl() 函数返回该图标的url,然后使用网络访问接口类来获取图标文件。

因为使用到网络访问,所以要在.h文件中添加前置类QNetworkAccessManager,网络访问的详细使用方法可以参考其他的文章。

  • 当加载的网站图标发生变化时,QWebEngineView会发射iconUrlChanged() 信号,所以通过关联iconUrlChanged()信号来获取图标的url。
connect(view, &QWebEngineView::iconUrlChanged, this, &MainWindow::handleIconUrlChanged());

获取到图标的url后,通过QNetworkAccessManager调用get()函数来获取图标文件。

void MainWindow::handleIconUrlChanged(const QUrl &url)
{
    QNetworkRequest iconRequest(url);
    QNetworkReply *iconReply = manager->get(iconRequest);
    iconReply->setParent(this);
    connect(iconReply, &QNetworkReply::finished, this, &MainWindow::handleIconLoaded);
}

void MainWindow::handleIconLoaded()
{
    QIcon icon;
    QNetworkReply *iconReply = qobject_cast<QNetworkReply *>(sender());
    if(iconReply && iconReply->error() == QNetworkReply::NoError)
    {
        QByteArray data = iconReply->readAll();
        QPixmap pixmap;
        pixmap.loadFromData(data);
        icon.addPixmap(pixmap);
        iconReply->deleteLater();
    }else{
        icon = QIcon(QStringLiteral("../image/defaulticon.png"));
    }
    setWindowIcon(icon);
}

实现网页内容的放大、缩小、重置:

使用QWebEngineView的setZoomFactor(qreal factor) 函数可以实现网页内容的缩放,其中,factor是缩放因子,它的取值范围是0.25~5.0,表示最大可以放大到500%,最小可以缩小到25%。可以通过zoomFactor() 函数获取网页内容现在的缩放因子是多少。

QMenu *viewMenu = new QMenu(tr("查看"));
//放大
QAction *zoomIn = viewMenu->addAction(tr("放大"));
zoomIn->setShortcurt(QKeySequence(Qt::CTRL | Qt::Key_Plus));
connect(zoomIn, &QAction::triggered, [this](){
    view->setZoomFactor(view->zoomFactor() + 0.1);//放大1%
});
//缩小
QAction *zoomOut = viewMenu->addAction(tr("缩小"));
zoomOut->setShortcurt(QKeySequence(Qt::CTRL | Qt::Key_Minus));
connect(zoomOut, &QAction::triggered, [this](){
    view->setZoomFactor(view->zoomFactor() - 0.1);//缩小1%
});
//重置
QAction *resetZoom = viewMenu->addAction(tr("重置"));
resetZoom->setShortcurt(QKeySequence(Qt::CTRL | Qt::Key_0));
connect(resetZoom, &QAction::triggered, [this](){
    view->setZoomFactor(1.0);//缩小1%
});
menuBar()->addMenu(viewMenu);