PyQt4. Как получить результат всех запросов из QWebView?

Приветствую хабра-сообщество.

Столкнулся с проблемой получения результатов побочных запросов при использовании QWebView из состава PyQt4.



Наследую и настраиваю свой QWebView:

class MainWindow(QWebView):<br>
    def __init__(self, parent = None):<br>
        super(MainWindow,self).__init__(parent)<br>
        settings = self.settings()<br>
        settings.setAttribute(QWebSettings.JavascriptEnabled,True)<br>
        settings.setAttribute(QWebSettings.PluginsEnabled,True)<br>


Тоже самое делаю с QNetworkAccessManager:

class CustomManager(QNetworkAccessManager):<br>
    def __init__(self, parent = None):<br>
        super(CustomManager,self).__init__(parent)<br>
        self.connect(self, SIGNAL("finished(QNetworkReply*)"), self.print_response)<br>
   <br>
    def print_response(self, reply):<br>
        print reply.url(), reply.isFinished()<br>
        print reply.readAll() #EMPTY!<br>


Ну и наконец запускаем всё это дело:

app = QApplication(sys.argv)<br>
app.setApplicationName("test")<br>
<br>
window = MainWindow()<br>
manager = CustomManager()<br>
window.page().setNetworkAccessManager(manager)<br>
<br>
window.load(QUrl("http://ya.ru/"))<br>
window.show()<br>
sys.exit(app.exec_())<br>


И вот тут выходит, что строка print reply.readAll() постоянно пуста. При этом reply.isFinished(), как и положено, True.



Сперва решил, что использую не тот сигнал и переопределил QNetworkAccessManager.createRequest с целью добраться до исходного reply и подцепиться на его сигнал finished. Однако и тут результат был тот же — по всем ответам запрос выполнен, но результат не прочитать (пустой).



Пробовал и вешать цикл ожидания результата в методе print_response, но это уводило в бесконечную рекурсию.



В общем, прошу помочь и не пинать =)



UPD: решение состоит в проксировании QNetworkReply. За основу рекомендую взять этот код (или его аналог на плюсах)

Единственная проблема при данном подходе — перестаёт работать смена содержимого QWebView, вызванная различными действиями (пользователя или яваскриптом). То есть первый load() отображается нормально, а вот дальше процесс идёт, но не показывается.
  • Вопрос задан
  • 4658 просмотров
Пригласить эксперта
Ответы на вопрос 1
@gagoman
Собрал ваш пример с PySide — все работает.
Python 2.6.6, PySide 1.1.0qt474, Win 7 x86

Попробовал немного другой вариант, а именно:
вместо:
self.connect(self, SIGNAL("finished(QNetworkReply*)"), self.print_response)

использовал:
self.finished.connect(self.print_response)


В данном случае тоже сработало.

Я так понял, вы ждете в output что-то типа:

PySide.QtCore.QUrl('http://www.yandex.ru/data/mail.js?yaru=y') True

PySide.QtCore.QUrl('http://kiks.yandex.ru/system/fc06.html') True

PySide.QtCore.QUrl('http://kiks.yandex.ru/system/fc06.swf') True

PySide.QtCore.QUrl('http://suggest.yandex.ru/jquery-1-4-2.crossframeajax.html') True


Если надо — проверю на PyQt

P.S. и пожалуйста — не ставьте точки с запятой в конце строки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы