16

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

4

4 回答 4

13

我实际上并没有这样做,但我认为您可以使用QNetworkAccessManager.

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

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

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

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

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

编辑:

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

将插槽附加到 QWebFrame::javascriptWindowObjectCleared() 信号。此时调用QWebFrame::evaluateJavascript()添加类似如下代码: window.onload = function() { // page has fully loaded }

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

希望这能回答这个问题!

于 2009-08-26T11:16:03.423 回答
2

要检查特定元素的负载,您可以使用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"
于 2012-12-05T15:35:55.247 回答
1

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

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

希望这有助于给你一个尝试的方向......

于 2009-08-25T13:22:20.313 回答
0

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

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

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

于 2014-12-09T11:43:22.483 回答