实现自定义QWebEngineUrlSchemeHandler,无法使用QNetworkReply进行回复

时间:2017-05-17 09:38:59

标签: c++ qt5 qtwebengine qtnetwork

使用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

通过使用CustomHandler::slotErrorwhich corresponds to a canceled operation调用错误广告位QNetworkReply::NetworkError,代码失败。

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

2 个答案:

答案 0 :(得分:0)

要避免此错误,您必须插入

reply.deleteLater()

但在我的情况下,我没有看到任何结果显示。不知道该怎么办才能使用QNetworkReply

答案 1 :(得分:0)

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

您也可以将数据移至QBuffer上的finished上,但是由于任何原因,您必须在缓冲区close()上进行回复,否则它不会被读取并显示为空的回应。