环境

系统:win7 64位旗舰版

软件:VS2013、QT5.5.1-32位

概述

当网页打开一个新的窗口时,我们有时候需要根据URL地址来判断弹出窗口是否合理,如果合理则弹出新窗口,否则不弹出。本文假设你能够基本使用QT。

步骤

1)首先创建类InterceptNetworkAccessManager

class InterceptNetworkAccessManager : public QNetworkAccessManager {
Q_OBJECT
public:
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_OBJECT
public:
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_OBJECT
public:
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弹出窗口的更多相关文章

  1. VB动态添加WebBrowser控件,并拦截弹出窗口(不用引用任何组件)

    新建空白窗体,然后粘帖下面代码: Option ExplicitPublic WithEvents br As VBControlExtender Private Sub br_ObjectEvent ...

  2. 弹出窗口Session丢失、防止表单重复提交问题

    一.弹出窗口Session丢失问题 弹出窗口Session丢失使用window.showModalDialog进行信息的提示,相当方便,也容易控制外观和布局.但是存在一个严重的问题,就是Session ...

  3. jQuery弹出窗口浏览图片

    效果预览:http://keleyi.com/keleyi/phtml/jqtexiao/3.htm HTML文件代码: <!DOCTYPE HTML> <html> < ...

  4. EasyUI弹出窗口实例

    效果体验:http://hovertree.com/texiao/jeasyui/1.htm 源代码下载:HovertreeJEasyUI HTML文件代码: <!DOCTYPE html> ...

  5. 让IE8在win7下面能显示使用window.showmodaldialog弹出窗口的地址状态栏

    问题来源:最近又要对老的系统进行改善,由于用到了window.showmodaldialog这个方法弹出窗口,比如从主界面弹出新增或者修改窗口,如下图所示,显示没有地址栏,进行代码修改还要找到相应的文 ...

  6. java selenium (十二) 操作弹出窗口

    selenium 中如何处理弹出窗口 阅读目录 原理 在代码里, 通过         Set<String> allWindowsId = driver.getWindowHandles ...

  7. JSP弹出窗口和模式对话框

    本文转载于其它blog,在此向本文原创者,致意!    JSP 弹出窗口  一.window.open() 基础知识      1.window.open()支持环境:  JavaScript1.0+ ...

  8. [转]js来弹出窗口的详细说明

    1.警告对话框 <script> alert("警告文字") </script> 2.确认对话框 <script> confirm(" ...

  9. OAF_开发系列08_实现OAF通过Popup参数式弹出窗口(案例)

    20150711 Created By BaoXinjian

随机推荐

  1. asp.net MVC 路由机制 Route

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  2. android.view.WindowManager$BadTokenException: Unable to add window — token null is not for an applic

    之前遇到过这样的问题, 04-12 10:40:33.302: E/AndroidRuntime(17213): Caused by: android.view.WindowManager$BadTo ...

  3. c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法

    本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...

  4. Dreamer 框架 比Struts2 更加灵活

    winter 改名为Dreamer. 这次发布第二个版本. 这次修复了很多BUG 和完善了部分功能. 1.改进用户服务层 以后在服务层中只需要继承BaseSupport 泛型类 就可以实现对对象进行增 ...

  5. 使用docker搭建kafka环境

    Requirements 最近学习了下kafka,为方便搭建环境,使用docker进行部署. 需要首先安装docker的环境.要求操作系统是linux的64位系统. docker的安装(适于rpm/d ...

  6. vue使用resource发送ajax请求

    <script type="text/javascript"> new Vue({ el:'#app', created:function(){ var url=&qu ...

  7. USACO 3.3 A Game

    A GameIOI'96 - Day 1 Consider the following two-player game played with a sequence of N positive int ...

  8. Android studio使用smack连接xmpp服务器收发消息

    我使用的是ejabberd16.09的Linux版本,安装教程网上有很多,我在这里只介绍一下Android端连接.登录和收发消息的方法.文章最后附上了我写的一个demo,欢迎大家参考. ejabber ...

  9. JavaScript中常用的Document了解

    在我们使用js的时候经常会用到document 例如: document.write(""); document.getElementById(''); document.crea ...

  10. 高效开发之SASS篇

    作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家都知道,js中可以自定义变 ...