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

StackOverflow https://stackoverflow.com/questions/1302874

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

Редактировать:

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

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

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

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

Другие советы

Когда ваш исходный html / images / etc завершит загрузку, это все.IT является полностью заряжен.Этот факт не изменится, если вы затем решите использовать какой-нибудь 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