攔截QWebView快顯視窗

來源:互聯網
上載者:User

標籤:

環境

系統:win7 64位旗艦版

軟體:VS2013、QT5.5.1-32位

概述

當網頁開啟一個新的視窗時,我們有時候需要根據URL地址來判斷快顯視窗是否合理,如果合理則彈出新視窗,否則不彈出。本文假設你能夠基本使用QT。

步驟

1)首先建立類InterceptNetworkAccessManager

class InterceptNetworkAccessManager : public QNetworkAccessManager {    Q_OBJECTpublic:    InterceptNetworkAccessManager() {}    void setIntercept(bool intercept) { m_intercept = intercept; }signals:    // 攔截URL訊號 [8/17/2016 Chao.Dong]    void signalInterceptUrl(const QUrl& url);protected:    QNetworkReply* createRequest(QNetworkAccessManager::Operation op,        const QNetworkRequest &req,        QIODevice *outgoingData) override {                // 構造一個空的QNetworkRequest來攔截請求 [8/11/2016 Chao.Dong]        if (m_intercept) {            emit signalInterceptUrl(req.url());            return QNetworkAccessManager::createRequest(op, QNetworkRequest(), outgoingData);        }        return QNetworkAccessManager::createRequest(op, req, outgoingData);    }private:    bool m_intercept = true;};

該類的作用是攔截網路請求,因為在建立快顯視窗時,QT沒有將載入的URL地址給我們,所以我們必須先自己截獲請求,因為我們的目的只是為了擷取URL地址,這裡構造了一個空的請求是為了減小資源消耗。

2)讓後建立類HiddenWebView

/**  [8/17/2016 Chao.Dong] *    隱藏的web視窗 */class HiddenWebView : public QWebView {    Q_OBJECTpublic:    explicit HiddenWebView(QWidget* parent = NULL) {        QWebView::setVisible(false);        InterceptNetworkAccessManager* network = new InterceptNetworkAccessManager();        this->page()->setNetworkAccessManager(network);        connect(network, SIGNAL(signalInterceptUrl(const QUrl&)), this, SIGNAL(signalInterceptUrl(const QUrl&)), Qt::QueuedConnection);    }    virtual void setVisible(bool visible) {}signals:    void signalInterceptUrl(const QUrl& url);};

該類的作用是建立一個隱藏的web視窗,建立彈出的新視窗時,我們將隱藏web視窗給它之後,它會預設顯示該視窗,而我們只是為了之後能擷取新視窗的URL地址,所以並不需要顯示。

3)最後建立WebView

/**  [8/9/2016 Chao.Dong] *    Web視窗 */class WebView : public QWebView {    Q_OBJECTpublic:    explicit WebView(QWidget* parent = NULL) {        this->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);    }    virtual QWebView * createWindow(QWebPage::WebWindowType type) override {        switch (type)        {        case QWebPage::WebBrowserWindow:            HiddenWebView* web = new HiddenWebView();            connect(web, &HiddenWebView::signalInterceptUrl, [this, web](const QUrl& url) {                // 停止時會清除緩衝 [8/11/2016 Chao.Dong]                web->stop();                web->deleteLater();                emit signalOpenWindow(url);            });            return web;        }        return QWebView::createWindow(type);    }signals:    // 開啟新連結 [8/15/2016 Chao.Dong]    void linkClicked(const QUrl& url);    // 開啟新視窗訊號 [8/9/2016 Chao.Dong]    void signalOpenWindow(const QUrl& url);};

 該類的作用是顯示web視窗,並根據彈出新視窗的URL地址進行攔截。

結尾

最後的顯示:

最後完成的Demo:InterceptOpenWindow.zip

攔截QWebView快顯視窗

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.