两者QWebFrameQWebPage已经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()信号必须使用队列连接来连接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top