Как узнать, когда веб-страница загружается при использовании QtWebKit?
И то и другое QWebFrame
а также QWebPage
иметь void loadFinished(bool ok)
сигнал, который можно использовать для определения полной загрузки веб-страницы. Проблема заключается в том, что веб-страница загружается асинхронно (ajax). Как узнать, когда страница полностью загружена в этом случае?
4 ответа
На самом деле я этого не делал, но я думаю, что вы сможете достичь своего решения, используя QNetworkAccessManager
,
Вы можете получить QNetworkAccessManager из вашего QWebPage с помощью функции networkAccessManager(). QNetworkAccessManager имеет завершенный сигнал ( QNetworkReply * reply), который запускается всякий раз, когда файл запрашивает экземпляр QWebPage.
finished
сигнал дает вам экземпляр QNetworkReply, из которого вы можете получить копию сделанного исходного запроса, чтобы идентифицировать запрос.
Итак, создайте слот для подключения к finished
сигнал, используйте переданные в QNetworkReply методы, чтобы выяснить, какой файл только что завершил загрузку, и, если это ваш Ajax-запрос, выполните любую необходимую вам обработку.
Единственное предостережение, что я никогда не делал этого раньше, поэтому я не уверен на 100%, что это сработает.
Другой альтернативой может быть использование методов QWebFrame для вставки объектов в объектную модель страницы, а также вставка некоторого JavaScript, который затем уведомляет ваш объект о завершении запроса Ajax. Это немного хакерский способ сделать это, но он определенно должен работать.
РЕДАКТИРОВАТЬ:
Второй вариант мне кажется лучше. Рабочий процесс выглядит следующим образом:
Присоедините слот к сигналу QWebFrame::javascriptWindowObjectCleared(). На этом этапе вызовите QWebFrame::valuJavascript(), чтобы добавить код, подобный следующему: window.onload = function() { // страница полностью загружена}
Поместите любой код, который вам нужен в этой функции. Возможно, вы захотите добавить QObject на страницу через QWebFrame::addToJavaScriptWindowObject(), а затем вызвать функцию для этого объекта. Этот код будет выполняться только тогда, когда страница полностью загружена.
Надеюсь, это ответит на вопрос!
Для проверки загрузки конкретного элемента вы можете использовать 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"
Когда ваш исходный html/images/etc заканчивает загрузку, все. Он полностью загружен. Этот факт не изменится, если вы решите использовать некоторый JavaScript, чтобы получить дополнительные данные, просмотры страниц или что-то еще после этого.
Тем не менее, я подозреваю, что вы хотите сделать здесь - предоставить объект / интерфейс QtScript вашему представлению, которое вы можете вызывать из скрипта вашей страницы, эффективно предоставляя "обратный вызов" в ваш C++, как только вы решите (из скрипта страницы) что вы "полностью загружены".
Надеюсь, что это поможет дать вам направление, чтобы попробовать...
Оператор подумал, что это связано с задержкой запросов AJAX, но может быть и другая причина, которая также объясняет, почему очень короткая задержка устраняет проблему. Существует ошибка, которая вызывает описанное поведение:
https://bugreports.qt-project.org/browse/QTBUG-37377
Чтобы обойти эту проблему, сигнал loadFinished() должен быть подключен через соединение в очереди.