我试图在Qt中创建一个加载URL的对话框(我不想向最终用户公开,因此是对话框)。用户在页面上输入凭据后,服务器将返回我想要捕获的重定向URL。我怎么能这样做?
QtWebkit让这很容易,因为QWebView有一个QNetworkAccessManager对象。但是使用QtWebEngine,QWebEngineView类没有此功能。前者还允许通过使用QNetworkRequest类为任何请求设置HTTP标头,然后在QWebView中加载具有这些特定请求的请求。如何使用QWebEngineView?
答案 0 :(得分:6)
从Qt 5.6开始,针对QWebEngineView
尝试实现的目标的建议解决方案是QWebEngineUrlRequestInterceptor:
实现QWebEngineUrlRequestInterceptor接口并在配置文件上安装拦截器可以在URL请求到达Chromium的网络堆栈之前拦截,阻止和修改它们。
这是一个抽象类,这意味着你需要将它子类化以获得你想要的东西:
#include <QWebEngineUrlRequestInterceptor>
#include <QDebug>
class RequestInterceptor : public QWebEngineUrlRequestInterceptor
{
public:
explicit RequestInterceptor(QObject * parent = Q_NULLPTR) : QWebEngineUrlRequestInterceptor(parent) {}
virtual void interceptRequest(QWebEngineUrlRequestInfo & info) Q_DECL_OVERRIDE;
};
void RequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo & info)
{
// Intercepting the requested URL
QUrl url = info.requestUrl();
qDebug() << "Request URL: " << url;
// Optionally redirect the request URL but it only works for requests
// without payload data such as GET ones
info.redirect(QUrl("https://www.google.com"));
// Set HTTP header
QByteArray httpHeaderName = "SomeHeaderName";
QByteArray httpHeaderValue = "SomeHeaderValue";
info.setHttpHeader(httpHeaderName, httpHeaderValue);
}
然后你需要在QWebEngineProfile
中为特定的QWebEnginePage
注册指向此拦截器的指针,如下所示:
QWebEngineView * view = new QWebEngineView;
RequestInterceptor * interceptor = new RequestInterceptor(view);
QWebEngineProfile * profile = new QWebEngineProfile(view);
profile->setRequestInterceptor(interceptor);
QWebEnginePage * page = new QWebEnginePage(profile, view);
view->setPage(page);