4

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 メソッドをオーバーライドして、すべてのページ リクエストを受け取り、Url が .ajax 拡張子で終わる場合は JSON オブジェクトで応答します。ただし、データをネットワーク ストリームに書き戻すのは難しいと感じています。

これについてのヒントやヒントはありますか?

乾杯、ベン

アップデート:

こんにちは Abhijith、私はあなたの解決策を試みましたが、信号をスロットに接続できません。

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::replyRecieved(QNetworkReply*)

更新

わかりましたが、IODeviceに書き込もうとすると失敗し、読み取り専用デバイスであることを示しています。

すべての助けをありがとう。

4

1 に答える 1

1

これには多くの方法があります。これは一つの方法です。

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 からの終了など。

于 2011-05-19T16:12:49.073 に答える