书接上回,关于Qt加载网页(一)末尾提到一个createWindows用法的问题,并且提供了两个参考博文。本人在初次使用createWindows的时候产生了一个疑问,如果在函数中直接返回this,是不是就存在一个内存溢出的可能性?(如以下代码所示)
- QWebEngineView* createWindow(QWebEnginePage::WebWindowType type) override
- {
- //加载链接地址
- this->load(url_);
- return this;
- }
如果不在末尾return点什么东西的话,似乎无法直接在当前QWebEngineView中显示出目标url。除非你重新再新建一个QWebEngineView,这种做法有点类似与目前主流浏览器的多页面显示方案(假如你现在是电脑网页看到本博文的时候,你的浏览器应该有多个页面存在)。
看到这里,我的矛盾点出来了,即如果正常return,这个地方有内存溢出的风险,因为加载新的url了,而上一个url虽然看不见了,但是它依然存在于电脑内存的某个犄角旮瘩。如果不return,那么这个新的url不会显示在当前QWebEngineView。
当然,也有可能是我关于web编程的水平问题,才导致这么个矛盾点。因为我也只是心血来潮想试试搞个浏览器玩玩。
于是我对着代码里面的createWindow按下了F1,Qt的帮助文档果然没让我失望,请看截图
原来createWindow还有两幅面孔,或者说,QWebEngine模块中存在两个createWindow,一个叫QWebEngineView::createWindow,另一个叫QWebenginePage::createWindow。这俩货乍一看好像功能一样,都是创建一个新的Window来加载网页。
我们选择QWebenginePage::createWindow进去阅读一下,帮助文档给我看了这个:
部分翻译结果如下:
这个函数被调用来创建指定类型的一个新窗口。例如,当一个JavaScript程序请求在一个新的窗口中打开一个文档。
如果可以创建新窗口,新窗口的QWebEnginePage返回;否则将返回一个空指针。
如果视图相关的网页是一个QWebEngineView对象,然后默认实现将请求转发给QWebEngineView:: createWindow ();否则返回一个空指针。
注意:在触发的情况下,当窗口创建JavaScript,除了重新实现这个方法的应用程序也必须设置QWebEngineSettings:: JavascriptCanOpenWindows真正为了被调用的方法。
我瞬间意识到,有时候createWindow加载不出来新的页面,有可能是新页面的类型不对,就好比斯蒂芬·库里和赛斯·库里的关系,他俩都是得分后卫,而且都是戴尔·库里的孩子。但是我们常说的“锦州拉文”、“水花兄弟”、“我库”等等,都是指斯蒂芬·库里,而url指向的网页也存在两种,一种斯蒂芬·库里的勇士队,一种是塞斯·库里的篮网队。当url指向篮网的时候,我们要求返回一个斯蒂芬·库里,或者当url指向勇士的时候,我们要求返回一个塞斯·库里。这个时候,createWindow就只能返回一个空指针了,因为勇士没有塞斯·库里,篮网没有斯蒂芬·库里。
逻辑再回到上回书开始,我的设计结构是QWebEngineView之中包含QWebEnginePage,通过改变QWebEnginePage的内容来改变QWebEngineView显示的内容。
- QWebEnginePage* createWindow(QWebEnginePage::WebWindowType type) override
- {
- //加载链接地址
- this->load(url_);
- return nullptr;
- }
后来我为了添加一些其他功能,创建了一个class mwebenginepage(),继承了QWebEnginePage类,然后有了以下代码:
- QWebEnginePage *mwebenginepage::createWindow(QWebEnginePage::WebWindowType type){
- Q_UNUSED(type)
-
- // return new mwebenginepage();
- qDebug()<<"here were go............"<<this->url()<<endl;
- this->load(url_);
- return nullptr;
- }
通过QWebEngineView.setPage(QWebEnginePage),来直接设置当前要显示的网页。
本回书完