使用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::slotError
,which corresponds to a canceled operation调用错误广告位QNetworkReply::NetworkError
,代码失败。
有没有办法回复QNetworkReply
,还是必须等待请求完成,然后再将其回复内容提取到QBuffer
?
答案 0 :(得分:0)
要避免此错误,您必须插入
reply.deleteLater()
但在我的情况下,我没有看到任何结果显示。不知道该怎么办才能使用QNetworkReply
答案 1 :(得分:0)
从理论上讲,它应该按照您编码的方式工作,但实际上,只有从aRequestJob->reply("text/html", reply);
信号调用QNetworkReply::finished
时,它对我而言才可靠。您也可以尝试使用readyRead
信号,然后每次收到信号时都必须致电reply
,但据我所知,它不是很可靠,所以我决定坚持使用finished
信号。
您也可以将数据移至QBuffer
上的finished
上,但是由于任何原因,您必须在缓冲区close()
上进行回复,否则它不会被读取并显示为空的回应。