• 关于Qt 加载网页(二) QWebenginePage和QWebengineView傻傻分不清楚


    书接上回,关于Qt加载网页(一)末尾提到一个createWindows用法的问题,并且提供了两个参考博文。本人在初次使用createWindows的时候产生了一个疑问,如果在函数中直接返回this,是不是就存在一个内存溢出的可能性?(如以下代码所示)

    1. QWebEngineView* createWindow(QWebEnginePage::WebWindowType type) override
    2. {
    3. //加载链接地址
    4. this->load(url_);
    5. return this;
    6. }

    如果不在末尾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显示的内容。

    1. QWebEnginePage* createWindow(QWebEnginePage::WebWindowType type) override
    2. {
    3. //加载链接地址
    4. this->load(url_);
    5. return nullptr;
    6. }

    后来我为了添加一些其他功能,创建了一个class mwebenginepage(),继承了QWebEnginePage类,然后有了以下代码:

    1. QWebEnginePage *mwebenginepage::createWindow(QWebEnginePage::WebWindowType type){
    2. Q_UNUSED(type)
    3. // return new mwebenginepage();
    4. qDebug()<<"here were go............"<<this->url()<<endl;
    5. this->load(url_);
    6. return nullptr;
    7. }

    通过QWebEngineView.setPage(QWebEnginePage),来直接设置当前要显示的网页。

    本回书完

  • 相关阅读:
    【前端】HTML标签(下)
    Linux安装HBase
    高绩效人力资源团队与众不同的 5 件事
    算法与数据结构【30天】集训营——二叉排序树的创建、查找、插入、删除操作(15)
    Roreg复现
    【C++】C++学习记录.DAY4-类的详解
    双层循环和循环语句
    Java手写选择排序和算法案例拓展
    1100 Mars Numbers
    数学与机器学习:共舞于智能时代的双璧
  • 原文地址:https://blog.csdn.net/weixin_42043127/article/details/125476367