標籤:
環境
系統: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快顯視窗