QWebFrame
和QWebPage
都有void loadFinished(bool ok)
信号,可用于检测网页何时完全加载。问题是当网页异步加载某些内容时(ajax)。在这种情况下如何知道页面何时完全加载?
答案 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()信号。