拦截QWebView弹出窗口
环境
系统: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弹出窗口的更多相关文章
- VB动态添加WebBrowser控件,并拦截弹出窗口(不用引用任何组件)
新建空白窗体,然后粘帖下面代码: Option ExplicitPublic WithEvents br As VBControlExtender Private Sub br_ObjectEvent ...
- 弹出窗口Session丢失、防止表单重复提交问题
一.弹出窗口Session丢失问题 弹出窗口Session丢失使用window.showModalDialog进行信息的提示,相当方便,也容易控制外观和布局.但是存在一个严重的问题,就是Session ...
- jQuery弹出窗口浏览图片
效果预览:http://keleyi.com/keleyi/phtml/jqtexiao/3.htm HTML文件代码: <!DOCTYPE HTML> <html> < ...
- EasyUI弹出窗口实例
效果体验:http://hovertree.com/texiao/jeasyui/1.htm 源代码下载:HovertreeJEasyUI HTML文件代码: <!DOCTYPE html> ...
- 让IE8在win7下面能显示使用window.showmodaldialog弹出窗口的地址状态栏
问题来源:最近又要对老的系统进行改善,由于用到了window.showmodaldialog这个方法弹出窗口,比如从主界面弹出新增或者修改窗口,如下图所示,显示没有地址栏,进行代码修改还要找到相应的文 ...
- java selenium (十二) 操作弹出窗口
selenium 中如何处理弹出窗口 阅读目录 原理 在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles ...
- JSP弹出窗口和模式对话框
本文转载于其它blog,在此向本文原创者,致意! JSP 弹出窗口 一.window.open() 基础知识 1.window.open()支持环境: JavaScript1.0+ ...
- [转]js来弹出窗口的详细说明
1.警告对话框 <script> alert("警告文字") </script> 2.确认对话框 <script> confirm(" ...
- OAF_开发系列08_实现OAF通过Popup参数式弹出窗口(案例)
20150711 Created By BaoXinjian
随机推荐
- ASP.NET网站运行常见错误以及解决方法(持续更新)
一.A potentially dangerous Request.Form value was detected from the client 用户在页面上提交表单到服务器时,服务器会检测到一些潜 ...
- Web开发必回知识点
Web前端必须知道 一.常用那几种浏览器测试?有哪些内核(Layout Engine)? 1.浏览器:IE,Chrome,FireFox,Safari,Opera. 2.内核:Trident,Geck ...
- 结构-行为-样式-angularJs笔记
0.关于Ng-app 通过ngApp指令来引导Angularjs应用是一种简洁的方式 ,适合大多数情况.在高级开发中,例如使用脚本装载应用,您也可以使用Bootstrap手动引导AngularJs ...
- [ios2]ios系统中各种设置项的url链接
在代码中调用如下代码:(ps: ios 5.0 以后不可用)NSURL*url=[NSURL URLWithString:@"prefs:root=WIFI"];[[UIAppli ...
- c#-委托,匿名方法,lambda表达的关系
什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...
- For循环输出一个表格
<!-- 作者:郑伟钊 时间:2017-01-16 描述:通过一个循环的嵌套输出一个表格 --> <?php header("Content-type:text/html; ...
- Perception(1.2)
4.1.2 Definition of Coordinate Systems The global coordinate system is described by its origin lying ...
- 【.NET-EF】Entity Framework学习笔记1 - VS2013没有EF的解决方法
解决方法:我本来也没有,百度了一下,在C:\ProgramData\Package Cache\{08AEF86A-1956-4846-B906-B01350E96E30}v12.0.20912.0\ ...
- angular 格式化日期
参考:http://blog.csdn.net/zk437092645/article/details/37882191 html: <input type="text" d ...
- maven项目添加websocket
最近由于项目业务需求,需要用到websocket来实现即时信息的推送,学习了一下websocket,网上搜了一下学习教程,很多版本看的我云里雾里,最后选择用tomcat提供的最新版本(tomcat 启 ...