Как я могу прочитать содержимое (тело ответа http) из QNetworkReply

Я использую qt5.3, и я много гуглил перед публикацией.

Я хочу читать данные из QNetworkReply, у меня есть QWebView и мне также нужно, чтобы http-ответ читался QWebView для отображения веб-страницы. Что мне нужно, это просто войти в веб-контент или любой другой ответ на http сообщения.

Проблема в QNetworkReply это то, что можно прочитать только один раз.

  1. Если я позвоню readAll() когда я выбираю readyRead() сигнал, я получу полные данные. Но это будет очищено так QWebView ничего не отображает (не получит никаких данных ответа).

  2. Или если я выберу finished() сигнал, так как данные уже прочитаны QWebView (или же QNetworkAccessManager) Я ничего не получу, если позвоню readAll() Вот. Есть ли где-то QNetworkReplyили менеджер или любой другой класс хранит данные, которые я еще могу прочитать?

В # 1 я могу получить часть данных, если позвоню peek(), Эта функция не очищает данные ответа. Но это не сработает, если тело ответа большое. QNetworkReply это последовательная вещь, которую я не могу ни знать ее данные, ни читать дальше, чем в буфере.

Я понятия не имею, как это сделать …..

Я просто хочу отслеживать и регистрировать тело запроса и ответа на любой запрос, сделанный на моем QWebView

Изменить: обратите внимание, что мои данные для чтения из ответа размером до 1 МБ, поэтому не будет хорошо, чтобы просмотреть все данные без дальнейшего чтения.

4

Решение

Вы можете создать свой собственный подкласс 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);
0

Другие решения


По вопросам рекламы [email protected]