Приветствую хабра-сообщество.
Столкнулся с проблемой получения результатов побочных запросов при использовании 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() отображается нормально, а вот дальше процесс идёт, но не показывается.