webview.cpp

转载 2017年01月03日 21:48:58
#include "browser.h"
#include "browserwindow.h"
#include "tabwidget.h"
#include "webpage.h"
#include "webpopupwindow.h"
#include "webview.h"
#include <QContextMenuEvent>
#include <QDebug>
#include <QMenu>
#include <QMessageBox>
#include <QNetworkReply>
#include <QTimer>

WebView::WebView(QWidget *parent)
    : QWebEngineView(parent)
    , m_loadProgress(0)
{
    connect(this, &QWebEngineView::loadProgress, [this](int progress) {
        m_loadProgress = progress;
    });
    connect(this, &QWebEngineView::loadFinished, [this](bool success) {
        if (!success) {
            qWarning() << "Could not load page: " << url();
            m_loadProgress = 0;
        }
    });
    connect(this, &QWebEngineView::iconUrlChanged, this, &WebView::handleIconUrlChanged);
    connect(this, &QWebEngineView::renderProcessTerminated,
            [this](QWebEnginePage::RenderProcessTerminationStatus termStatus, int statusCode) {
        QString status;
        switch (termStatus) {
        case QWebEnginePage::NormalTerminationStatus:
            status = tr("Render process normal exit");
            break;
        case QWebEnginePage::AbnormalTerminationStatus:
            status = tr("Render process abnormal exit");
            break;
        case QWebEnginePage::CrashedTerminationStatus:
            status = tr("Render process crashed");
            break;
        case QWebEnginePage::KilledTerminationStatus:
            status = tr("Render process killed");
            break;
        }
        QMessageBox::critical(window(), status, tr("Render process exited with code: %1").arg(statusCode));
        QTimer::singleShot(0, [this] { reload(); });
    });
}

void WebView::setPage(WebPage *page)
{
    createWebActionTrigger(page,QWebEnginePage::Forward);
    createWebActionTrigger(page,QWebEnginePage::Back);
    createWebActionTrigger(page,QWebEnginePage::Reload);
    createWebActionTrigger(page,QWebEnginePage::Stop);
    QWebEngineView::setPage(page);
}

QIcon WebView::icon() const
{
    if (!m_icon.isNull())
        return m_icon;
    return QIcon(QLatin1String(":defaulticon.png"));
}

int WebView::loadProgress() const
{
    return m_loadProgress;
}

void WebView::createWebActionTrigger(QWebEnginePage *page, QWebEnginePage::WebAction webAction)
{
    QAction *action = page->action(webAction);
    connect(action, &QAction::changed, [this, action, webAction]{
        emit webActionEnabledChanged(webAction, action->isEnabled());
    });
}

bool WebView::isWebActionEnabled(QWebEnginePage::WebAction webAction) const
{
    return page()->action(webAction)->isEnabled();
}

QNetworkAccessManager &WebView::networkAccessManager()
{
    static QNetworkAccessManager networkAccessManager;
    return networkAccessManager;
}

QWebEngineView *WebView::createWindow(QWebEnginePage::WebWindowType type)
{
    switch (type) {
    case QWebEnginePage::WebBrowserTab: {
        BrowserWindow *mainWindow = qobject_cast<BrowserWindow*>(window());
        return mainWindow->tabWidget()->createTab();
    }
    case QWebEnginePage::WebBrowserWindow: {
        BrowserWindow *mainWindow = new BrowserWindow();
        Browser::instance().addWindow(mainWindow);
        return mainWindow->currentTab();
    }
    case QWebEnginePage::WebDialog: {
        WebPopupWindow *popup = new WebPopupWindow(page()->profile());
        return popup->view();
    }
    }
    return nullptr;
}

void WebView::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu *menu = page()->createStandardContextMenu();
    const QList<QAction*> actions = menu->actions();
    auto it = std::find(actions.cbegin(), actions.cend(), page()->action(QWebEnginePage::OpenLinkInThisWindow));
    if (it != actions.cend()) {
        (*it)->setText(tr("Open Link in This Tab"));
        ++it;
        QAction *before(it == actions.cend() ? nullptr : *it);
        menu->insertAction(before, page()->action(QWebEnginePage::OpenLinkInNewWindow));
        menu->insertAction(before, page()->action(QWebEnginePage::OpenLinkInNewTab));
    }
    connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);
    menu->popup(event->globalPos());
}

void WebView::handleIconUrlChanged(const QUrl &url)
{
    QNetworkRequest iconRequest(url);
#ifndef QT_NO_OPENSSL
    QSslConfiguration conf = iconRequest.sslConfiguration();
    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    iconRequest.setSslConfiguration(conf);
#endif
    QNetworkReply *iconReply = networkAccessManager().get(iconRequest);
    iconReply->setParent(this);
    connect(iconReply, &QNetworkReply::finished, this, &WebView::handleIconLoaded);
}

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

webView解决内存泄漏

  • 2017年12月08日 16:25
  • 2KB
  • 下载

OpenCV3.0 Examples学习笔记(12)-houghlines.cpp-通过HoughLinesP函数实现直线检测

这个系列的目的是通过对OpenCV示例,进一步了解OpenCV函数的使用,不涉及具体原理。 简介 本文记录了对OpenCV示例houghlines.cpp的分析。 资料地址:http://docs.o...

Android完美接入腾讯TBS浏览器WebView

  • 2017年11月13日 15:23
  • 26.79MB
  • 下载

mui 滑动切换界面 多webview模式

  • 2017年09月21日 21:27
  • 133KB
  • 下载

Caffe源码:io.cpp 分析

目录 目录简单介绍主要函数 ReadProtoFromTextFile 函数WriteProtoToTextFile 函数ReadProtoFromBinaryFile...

webview与js的通讯

  • 2015年12月24日 15:56
  • 1.42MB
  • 下载

Cpp Concurrency In Action(读书笔记6)——无锁并发数据结构设计

定义和意义   使用互斥量、条件变量,以及“期望”来同步“阻塞”(blocking)数据的算法和数据结构。使用原子操作的“内存序”特性,并使用这个特性来构建无锁数据结构。   不使用阻塞库的数据结构和...
  • BestZem
  • BestZem
  • 2016年11月16日 23:22
  • 501
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:webview.cpp
举报原因:
原因补充:

(最多只允许输入30个字)