【问题标题】:Implementing a custom QWebEngineUrlSchemeHandler, cannot reply with a QNetworkReply实现自定义 QWebEngineUrlSchemeHandler,无法使用 QNetworkReply 回复
【发布时间】:2017-10-16 16:38:46
【问题描述】:

使用 Qt 5.8,我们设置实现自定义QWebEngineUrlSchemeHandler。它的行为应该是发出GET 查询并以返回的内容进行响应。

我们的理解是内容是通过QWebEngineUrlRequestJob::reply第二个参数返回给web引擎的,第二个参数应该派生自QIODevice。由于QNetworkReply 派生自它,我们希望这种类型的实例成为有效的内容提供者。

一个最小的例子(不关心释放动态分配的内存)是:

#include <QBuffer>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QWebEngineUrlRequestJob>
#include <QWebEngineUrlSchemeHandler>

class CustomHandler : public QWebEngineUrlSchemeHandler
{
    Q_OBJECT

public:
    void requestStarted(QWebEngineUrlRequestJob *aRequestJob) override
    {
        QUrl requestedUrl("http://stackoverflow.com/");
        QNetworkRequest *request = new QNetworkRequest(requestedUrl);
        QNetworkReply *reply = mManager.get(*request);

        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
                this, SLOT(slotError(QNetworkReply::NetworkError)));

        // Reply segment
        aRequestJob->reply("text/html", reply);
    }

public slots:
    void slotError(QNetworkReply::NetworkError aError)
    {
        std::cout << "Error: "  <<  aError << std::endl;
    }

private:
    QNetworkAccessManager mManager;
};

执行时,输出:

Error: 5

代码因此通过使用QNetworkReply::NetworkErrorwhich corresponds to a canceled operation 调用错误槽CustomHandler::slotError 失败。


有没有办法回复QNetworkReply,还是必须等待请求完成,然后先将其回复内容提取到QBuffer

【问题讨论】:

    标签: c++ qt5 qtwebengine qtnetwork


    【解决方案1】:

    为了避免这个错误,你必须插入

    reply.deleteLater()
    

    但在我的情况下,我没有看到任何结果。不知道该怎么做才能与 QNetworkReply 一起工作

    【讨论】:

    • 不好的建议,一旦 Qt 进入事件循环,这将删除回复,但文档say the contrary,它必须保持可用,直到作业完成。
    【解决方案2】:

    理论上它应该按照您的编码方式工作,但实际上它只有在从 QNetworkReply::finished 信号调用 aRequestJob-&gt;reply("text/html", reply); 时才对我可靠地工作。你也可以尝试使用readyRead信号,然后每次收到信号都得调用reply,但据我记得不是很可靠,所以我决定坚持使用finished信号.

    您也可以在finished 上将数据移动到QBuffer,但出于任何原因,您必须在回复之前close() 缓冲区,否则它不会被读取并显示为空响应。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多