Как узнать, когда веб-страница загружается при использовании QtWebKit? - PullRequest
14 голосов
/ 20 августа 2009

Оба QWebFrame и QWebPage имеют сигнал void loadFinished(bool ok), который можно использовать для определения полной загрузки веб-страницы. Проблема в том, что веб-страница загружается асинхронно (ajax). Как узнать, когда страница полностью загрузится в этом случае?

Ответы [ 4 ]

12 голосов
/ 26 августа 2009

На самом деле я этого не делал, но я думаю, что вы , возможно, сможете найти решение, используя QNetworkAccessManager.

Вы можете получить QNetworkAccessManager из QWebPage, используя функцию networkAccessManager () . QNetworkAccessManager имеет сигнал закончен (QNetworkReply * ответ) , который запускается всякий раз, когда файл запрашивается экземпляром QWebPage.

Сигнал finished дает вам экземпляр QNetworkReply, из которого вы можете получить копию сделанного исходного запроса для его идентификации.

Итак, создайте слот для подключения к сигналу finished, используйте переданные методы QNetworkReply, чтобы выяснить, какой файл только что завершил загрузку, и, если это ваш Ajax-запрос, выполните любую необходимую вам обработку.

Мое единственное предупреждение: я никогда не делал этого раньше, поэтому я не уверен на 100%, что это сработает.

Другой альтернативой может быть использование методов QWebFrame для вставки объектов в объектную модель страницы, а также вставка некоторого JavaScript, который затем уведомляет ваш объект о завершении запроса Ajax. Это немного хакерский способ сделать это, но он обязательно должен сработать.

EDIT:

Второй вариант мне кажется лучше. Рабочий процесс выглядит следующим образом:

Присоедините слот к сигналу QWebFrame :: javascriptWindowObjectCleared (). На этом этапе вызовите QWebFrame ::valuJavascript (), чтобы добавить код, подобный следующему: window.onload = function () {// страница полностью загружена}

Поместите любой код, который вам нужен, в эту функцию. Возможно, вы захотите добавить QObject на страницу через QWebFrame :: addToJavaScriptWindowObject (), а затем вызвать функцию для этого объекта. Этот код будет выполняться только после полной загрузки страницы.

Надеюсь, это ответит на вопрос!

1 голос
/ 05 декабря 2012

Для проверки загрузки конкретного элемента вы можете использовать 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"
1 голос
/ 25 августа 2009

Когда ваш исходный html / images / etc заканчивает загрузку, все. полностью загружен. Этот факт не изменится, если вы затем решите использовать некоторый javascript для получения дополнительных данных, просмотров страниц или чего-либо еще после этого.

Тем не менее, я подозреваю, что вы хотите сделать здесь - представить объект / интерфейс QtScript вашему представлению, которое вы можете вызвать из скрипта вашей страницы, эффективно предоставляя «обратный вызов» в ваш C ++, как только вы решили скрипт страницы), который вы «полностью загрузили».

Надеюсь, это поможет вам определить направление ...

0 голосов
/ 09 декабря 2014

Оператор подумал, что это связано с задержкой запросов AJAX, но также может быть и другая причина, объясняющая, почему очень короткая задержка устраняет проблему. Существует ошибка, которая вызывает описанное поведение:

https://bugreports.qt -project.org / просмотр / QTBUG-37377

Чтобы обойти эту проблему, сигнал loadFinished () должен быть подключен через соединение в очереди.

...