覆盖 QWebView 中的页面回复

Posted

技术标签:

【中文标题】覆盖 QWebView 中的页面回复【英文标题】:Overriding page replies in QWebView 【发布时间】:2011-05-19 15:19:55 【问题描述】:

我试图在 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 对象进行响应。但是我发现很难将数据写回网络流中。

关于如何进行此操作的任何提示或提示?

干杯, 本

更新:

嗨阿比吉斯, 我尝试了您的解决方案,但无法将信号连接到插槽。

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: No such slot ngcBrowser::replyRecieved(QNetworkReply*)

更新

好的,我已经设法让他工作,但是当我尝试写入 IODevice 时失败,表明它是只读设备。

感谢大家的帮助。

【问题讨论】:

所以如果一个 url 以 .ajax 结尾,你只是想发送 JSON 作为回复而不是别的吗?还是要将 JSON 附加到 http 响应? 我希望将 JSON 附加到 http 响应中。感谢您的宝贵时间。 【参考方案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 完成等。

【讨论】:

你好 Abhijith,关于他 QNetworkReply 是只读的事实有什么想法吗?顺便说一句,感谢您的所有帮助。 你试过 qnetworkreply->setOpenMode(QIODevice::ReadWrite) 吗? 我想扩展 QNetworkReply 是一种选择。这应该让你修改 Qnetworkreply 中的任何内容。 我不确定这将如何工作,因为 setOpenMode 是 QIODevice 的受保护方法。 由于它不是私有的,当您继承 QNetworkReply 时,您将能够覆盖它,它是 QIODevice 的子类。

以上是关于覆盖 QWebView 中的页面回复的主要内容,如果未能解决你的问题,请参考以下文章

QT 从 QWebView 的 QNetworkAccessManager 读取数据

QWebView 获取内容类型

使用 PyQt4 显示 HTML 页面时出错 - QWebView

QWebView 自动标签

Qt 5.3 Webkit QWebView中的Javascript太慢了,在Windows上挂了MainWindow

Qt:在 QWebView::linkClicked(QUrl) 上响应时出现问题 - 插槽信号问题