两者QWebFrame
都有信号,QWebPage
可void loadFinished(bool ok)
用于检测网页何时完全加载。问题是当网页有一些异步加载的内容(ajax)时。在这种情况下如何知道页面何时完全加载?
4 回答
我实际上并没有这样做,但我认为您可以使用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 添加到页面,然后在该对象上调用函数。此代码仅在页面完全加载时执行。
希望这能回答这个问题!
要检查特定元素的负载,您可以使用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"
当您的初始 html/images/etc 完成加载时,就是这样。它已完全加载。如果您随后决定使用一些 javascript 来获取一些额外的数据、页面浏览量或事后的任何内容,这一事实不会改变。
也就是说,我怀疑您在这里想要做的是向您的视图公开一个 QtScript 对象/接口,您可以从您的页面脚本调用它,一旦您决定(从页面脚本)有效地为您的 C++ 提供“回调”你已经“完全加载”了。
希望这有助于给你一个尝试的方向......
OP 认为这是由于延迟的 AJAX 请求,但也可能有另一个原因也解释了为什么很短的时间延迟可以解决问题。有一个错误会导致所描述的行为:
https://bugreports.qt-project.org/browse/QTBUG-37377
要解决此问题,loadingFinished() 信号必须使用排队连接进行连接。