Как узнать, когда загружается веб-страница при использовании QtWebKit?
-
19-09-2019 - |
Вопрос
И то, и другое 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() должен быть подключен с использованием подключения в очереди.