Переопределение ответов на странице в QWebView - PullRequest
4 голосов
/ 19 мая 2011

Я пытаюсь перехватить запрос страницы / формы в Qt QWebView и в некоторых случаях ответить альтернативным контентом.

QNetworkReply* ngcBrowser::createRequest(Operation operation, const QNetworkRequest& request, QIODevice* ioDevice)
{
        view->page()->setNetworkAccessManager(this);

        QNetworkReply* response = NULL;

        if (request.url().path().endsWith("ajax")) 
        {
            response = QNetworkAccessManager::createRequest(operation, request, ioDevice);

            response->write("{ success: true }");
        }
        else
        {
            response = QNetworkAccessManager::createRequest(operation, request, ioDevice);
        }

        return response;
}

Как вы можете видеть выше, я переопределил метод QNAM createRequest для получения всех запросов страниц и ответа с помощью объекта JSON, если URL-адрес заканчивается расширением .ajax. Однако мне трудно записывать данные обратно в сетевой поток.

Любые советы или подсказки, как это сделать?

Ура, Бен

Обновление:

Привет, Абхиджит, Я попробовал ваше решение, однако оно не может подключить сигнал к слоту.

QNetworkAccessManager* nam = view->page()->networkAccessManager();

bool status = QObject::connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyReceived(QNetworkReply*)));

if(!status)
{
QErrorMessage errorMessage;
errorMessage.showMessage("connect failed");
errorMessage.exec();
}

Ошибка:

Object :: connect: такого слота нет ngcBrowser :: replyReceve (QNetworkReply *)

Update :

Хорошо, мне удалось заставить его работать, однако, когда я пытаюсь записать в IODevice, происходит сбой, указывающий на его устройство ReadOnly.

Спасибо за помощь.

1 Ответ

1 голос
/ 19 мая 2011

Есть много способов сделать это.Это один из способов.

connect(networkAccessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyReceived(QNetworkReply*)))
....

void replyReceived(QNetworkReply* reply)    // reply slot
{
    if(reply->request().url().path().endsWith("ajax"))
    {
      QByteArray array = reply->readll();/*reply is cleared after this call and will not contains anything.*/
      /*Write the JSON wherever you want to in the array*/
      reply->write(array);

    }
}

Вам необходимо выполнить точную настройку в зависимости от того, какой сигнал вы хотите прослушать - ответ завершен из QNAM или завершен из QNetworkReply и т. Д.

...