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

时间:2009-08-19 22:03:38

标签: ajax qt asynchronous qtwebkit qwebpage

QWebFrameQWebPage都有void loadFinished(bool ok)信号,可用于检测网页何时完全加载。问题是当网页异步加载某些内容时(ajax)。在这种情况下如何知道页面何时完全加载?

4 个答案:

答案 0 :(得分:12)

我实际上并没有这样做,但我认为您可能能够使用QNetworkAccessManager来实现您的解决方案。

您可以使用networkAccessManager()功能从QWebPage获取QNetworkAccessManager。 QNetworkAccessManager有一个信号finished ( QNetworkReply * reply ),只要QWebPage实例请求文件就会触发该信号。

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

因此,创建一个插槽以附加到finished信号,使用传入的QNetworkReply方法确定哪个文件刚刚完成下载,如果是您的Ajax请求,请执行您需要执行的任何处理。

我唯一需要注意的是,我以前从未这样做过,所以我不能100%确定它会起作用。

另一种选择可能是使用QWebFrame的方法将对象插入到页面的对象模型中,并插入一些JavaScript,然后在Ajax请求完成时通知您的对象。这是一种稍微粗暴的做法,但绝对应该有效。

编辑:

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

将一个插槽附加到QWebFrame :: javascriptWindowObjectCleared()信号。此时,调用QWebFrame :: evaluateJavascript()添加类似如下的代码:     window.onload = function(){//页面已满载}

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

希望这回答了这个问题!

答案 1 :(得分:1)

当您的初始html / images / etc完成加载时,就是这样。 已完全加载。如果你决定使用一些javascript来获取一些额外的数据,页面浏览量或事后的任何事情,这个事实不会改变。

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

希望这有助于您指明尝试......

答案 2 :(得分:1)

要检查特定元素的负载,您可以使用QTimer。 python中有类似的东西:

@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 :(得分:0)

OP认为这是由于延迟了AJAX请求,但也有另一个原因也解释了为什么非常短时间延迟解决了问题。有一个错误会导致所描述的行为:

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

要解决此问题,必须使用排队连接连接loadingFinished()信号。