代码之家  ›  专栏  ›  技术社区  ›  Piotr Dobrogost

使用QtWebKit时如何知道网页何时加载?

  •  16
  • Piotr Dobrogost  · 技术社区  · 16 年前

    两者 QWebFrame QWebPage void loadFinished(bool ok)

    4 回复  |  直到 15 年前
        1
  •  13
  •   Rob Knight    16 年前

    我实际上没有做过这件事,但我认为你 可能 能够使用以下方式实现您的解决方案 QNetworkAccessManager .

    您可以使用以下命令从QWebPage获取QNetworkAccessManager networkAccessManager() 功能。QNetworkAccessManager有信号 finished ( QNetworkReply * reply ) 每当QWebPage实例请求文件时,它就会被触发。

    finished 该信号为您提供了一个QNetworkReply实例,您可以从中获取原始请求的副本,以识别该请求。

    因此,创建一个插槽以附着到 完成 signal,使用QNetworkReply中传递的方法来确定哪个文件刚刚完成下载,如果是Ajax请求,则执行所需的任何处理。

    我唯一的警告是,我以前从未做过这件事,所以我不能100%确定它会奏效。

    另一种选择可能是使用QWebFrame的方法将对象插入到页面的对象模型中,并插入一些JavaScript,然后在Ajax请求完成时通知您的对象。这是一种稍微有点棘手的方法,但肯定会奏效。

    编辑:

    第二种选择对我来说似乎更好。工作流程如下:

    window.onload=function(){//页面已完全加载}

    将您需要的任何代码放入该函数中。您可能希望通过QWebFrame::addToJavaScriptWindowObject()向页面添加QObject,然后调用该对象上的函数。此代码仅在页面完全加载时执行。

    希望这能回答问题!

        2
  •  2
  •   user1006989 user1006989    13 年前

    要检查特定元素的负载,您可以使用 QTimer

    @pyqtSlot()
    def on_webView_loadFinished(self): 
        self.tObject = QTimer()
        self.tObject.setInterval(1000)
        self.tObject.setSingleShot(True)
        self.tObject.timeout.connect(self.on_tObject_timeout)
        self.tObject.start()
    
    @pyqtSlot()
    def on_tObject_timeout(self):
        dElement = self.webView.page().currentFrame().documentElement()
        element  = dElement.findFirst("css selector")
        if element.isNull():
            self.tObject.start()
    
        else:
            print "Page loaded"
    
        3
  •  1
  •   Shaun    16 年前

    当你的初始html/images/etc加载完成时,就是这样

    也就是说,我怀疑你想在这里做的是向你的视图公开一个QtScript对象/接口,你可以从页面的脚本中调用它,一旦你决定(从页面脚本)你已经“完全加载”,就有效地在C++中提供一个“回调”。

    希望这能给你一个尝试的方向。..

        4
  •  0
  •   Silicomancer    11 年前

    非常 短时间延迟解决了这个问题。有一个错误导致了所描述的行为:

    https://bugreports.qt-project.org/browse/QTBUG-37377

    为了解决这个问题,loadingFinished()信号必须使用排队连接进行连接。

    推荐文章