Я использую qt5.3, и я много гуглил перед публикацией.
Я хочу читать данные из QNetworkReply
, у меня есть QWebView
и мне также нужно, чтобы http-ответ читался QWebView
для отображения веб-страницы. Что мне нужно, это просто войти в веб-контент или любой другой ответ на http сообщения.
Проблема в QNetworkReply
это то, что можно прочитать только один раз.
Если я позвоню readAll()
когда я выбираю readyRead()
сигнал, я получу полные данные. Но это будет очищено так QWebView
ничего не отображает (не получит никаких данных ответа).
Или если я выберу finished()
сигнал, так как данные уже прочитаны QWebView
(или же QNetworkAccessManager
) Я ничего не получу, если позвоню readAll()
Вот. Есть ли где-то QNetworkReply
или менеджер или любой другой класс хранит данные, которые я еще могу прочитать?
В # 1 я могу получить часть данных, если позвоню peek()
, Эта функция не очищает данные ответа. Но это не сработает, если тело ответа большое. QNetworkReply
это последовательная вещь, которую я не могу ни знать ее данные, ни читать дальше, чем в буфере.
Я понятия не имею, как это сделать …..
Я просто хочу отслеживать и регистрировать тело запроса и ответа на любой запрос, сделанный на моем QWebView
…
Изменить: обратите внимание, что мои данные для чтения из ответа размером до 1 МБ, поэтому не будет хорошо, чтобы просмотреть все данные без дальнейшего чтения.
Вы можете создать свой собственный подкласс QNetworkAccessManager
и переопределить виртуальную функцию createRequest
, Вызовите реализацию базового класса, чтобы получить объект ответа и подключиться readyRead
сигнал в какой-то слот, который будет захватывать данные. В этом слоте вызовите функцию peek для чтения данных, чтобы WebKit также получал данные:
class NetworkAccessManagerProxy : public QNetworkAccessManager {
Q_OBJECT
signals:
void dataGot(QByteArray data);
public:
NetworkAccessManagerProxy(QObject * parent = 0)
: QNetworkAccessManager()
{
}
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice *outgoingData)
{
reply = QNetworkAccessManager::createRequest(op, request, outgoingData);
connect(this,SIGNAL(readyRead()), SLOT(readInternal()));
return reply;
}
private slots:
void readInternal()
{
QByteArray data = reply->peek(reply->bytesAvailable());
emit dataGot(data);
}
private:
QNetworkReply* reply;
};
После создания QWebPage
объект, вызов setNetworkAccessManager
и передайте только что созданный экземпляр вашего подкласса:
QWebPage * page = new QWebPage;
page->setNetworkAccessManager(new NetworkAccessManagerProxy());
page->mainFrame()->load(url);
webView->setPage(page);