【发布时间】: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::NetworkError、which corresponds to a canceled operation 调用错误槽CustomHandler::slotError 失败。
有没有办法回复QNetworkReply,还是必须等待请求完成,然后先将其回复内容提取到QBuffer?
【问题讨论】:
标签: c++ qt5 qtwebengine qtnetwork