如何知道一个网页使用QtWebKit的时候装?
-
19-09-2019 - |
题
两者QWebFrame
和QWebPage
已经void loadFinished(bool ok)
其可以被用于检测当网页完全加载信号。问题是,当一个网页有异步加载某些内容(AJAX)。如何知道什么时候该页面在这种情况下被完全加载?
解决方案
我还没有真正做到这一点,但我觉得你的可能的能够使用QNetworkAccessManager
实现您的解决方案。
您可以使用 networkAccessManager()函数从QWebPage得到QNetworkAccessManager 。 QNetworkAccessManager具有信号成品(QNetworkReply *回复)其被触发每当一个文件由QWebPage实例请求。
在finished
信号给你一个QNetworkReply实例,从中可以得到制成的原始请求的副本,以便识别该请求。
因此,创建一个插槽连接到finished
信号,使用传入的QNetworkReply的方法来找出哪个文件刚刚完成下载,如果这是你的Ajax请求,你需要做任何处理。
我唯一要注意的是,我从来没有这样做过,所以我不是100%肯定它会工作。
另一种方法是使用QWebFrame的方法将对象插入页面的对象模型,还插入一些JavaScript,然后通知你的对象Ajax请求完成时。这是做的稍微hackier方式,但绝对应该工作。
编辑:
第二个选择似乎不如我。的工作流程如下:
附加的狭槽到QWebFrame :: javascriptWindowObjectCleared()信号。在这一点上,调用QWebFrame :: evaluateJavascript()添加类似于下面的代码: 在window.onload =函数(){//页面已经完全加载}
把你在功能需要的任何代码。你可能想通过QWebFrame :: addToJavaScriptWindowObject()的对象上一个QObject添加到页面中,然后调用一个函数。当页面完全加载这个代码将只执行。
希望这回答了这个问题!
其他提示
当您最初的HTML /图片/等加载完成,仅此而已。它是完全装满。这个事实不会改变,如果你再决定使用一些JavaScript在事后得到一些额外的数据,网页浏览或什么的。
这是说,你要在这里做什么,我怀疑是暴露QtScript对象/界面,你认为你可以从你的网页的脚本中调用,有效地提供“回调”到你的C ++一旦你决定(从网页脚本),你已经拥有“完全加载”。
希望这有助于给你一个方向去尝试......
要检查特定元素的负载可以用一个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"
在OP认为这是由于延迟AJAX请求,但也有可能是另一个原因,也解释了为什么一个的非常的短延时解决了这个问题。存在引起所描述的行为的一个错误:
https://bugreports.qt-project.org/browse/QTBUG-37377
要解决此问题的loadingFinished()信号必须使用队列连接来连接。