Pregunta

Tanto QWebFrame y QWebPage han void loadFinished(bool ok) señal que puede ser utilizado para detectar cuando una página web es completamente cargado. El problema es cuando una página web tiene algún contenido cargado de forma asíncrona (Ajax). ¿Cómo saber cuando la página se ha cargado completamente en este caso?

¿Fue útil?

Solución

No he hecho realmente esto, pero creo que pueden será capaz de lograr su solución utilizando QNetworkAccessManager.

Usted puede obtener el QNetworkAccessManager de su QWebPage utilizando el networkAccessManager () la función . QNetworkAccessManager tiene una terminado (* QNetworkReply respuesta) que se dispara cada vez que un archivo es solicitada por la instancia QWebPage.

La señal finished le da un ejemplo QNetworkReply, desde donde se puede obtener una copia de la petición original, con el fin de identificar la solicitud.

Por lo tanto, crear una ranura para conectar a la señal finished, utilizar el pasado-en los métodos de QNetworkReply de averiguar qué archivo acaba de terminar la descarga y si es su petición Ajax, hacer lo que el procesamiento que tiene que hacer.

Mi única advertencia es que nunca he hecho esto antes, así que no estoy 100% seguro de que iba a funcionar.

Otra alternativa podría ser el uso de métodos de QWebFrame para insertar objetos en modelo de objetos de la página y también insertar algo de JavaScript que luego notifica a su objeto cuando la petición Ajax se ha completado. Esta es una manera ligeramente hackier de hacerlo, pero definitivamente debe trabajar.

EDIT:

La segunda opción me parece mejor. El flujo de trabajo es el siguiente:

Adjuntar una ranura a la señal QWebFrame :: javascriptWindowObjectCleared (). En este punto, llame QWebFrame :: evaluateJavascript () para añadir un código similar al siguiente:     window.onload = function () {// página se ha cargado totalmente}

código de poner lo que necesita en esa función. Es posible que desee añadir un QObject a la página a través de QWebFrame :: addToJavaScriptWindowObject () y luego llamar a una función en ese objeto. Este código sólo se ejecuta cuando la página se ha cargado completamente.

Esperamos que esto responde a la pregunta!

Otros consejos

Cuando su html / imágenes iniciales / etc termina de cargar, eso es todo. Es es completamente cargado. Este hecho no cambia si se decide utilizar un poco de javascript para obtener algunos datos adicionales, páginas vistas o lo que sea después del hecho.

Dicho esto, lo que sospecho que quiere hacer aquí es exponer un QtScript objeto / interfaz a la vista que se puede invocar desde el guión de su página, proporcionando efectivamente una "devolución de llamada" en C ++, una vez que haya decidido (a partir de la script de la página) que ha tiene "completamente cargada".

Espero que esto ayuda a darle una dirección a tratar ...

Para comprobar la carga del elemento específico se puede utilizar un QTimer. Algo como esto en 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"

El PO pensó que era debido a las peticiones AJAX retraso pero también podría ser otra de las razones que explica también por qué un muy de retardo corto tiempo soluciona el problema. Hay un error que hace que el comportamiento descrito:

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

Para evitar este problema la señal loadingFinished () debe ser conectado mediante la conexión en cola.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top