2016-10-28 4 views
1

Qt에서 URL을로드하는 대화 상자를 만들려고합니다 (최종 사용자에게 공개하고 싶지 않으므로 Dialog). 사용자가 페이지에 자격 증명을 입력하면 서버는 캡처하려는 리디렉션 URL을 반환합니다. 어떻게해야합니까?QWebEngineView로 서버 응답 캡쳐

QtWebkit은 QWebView에 QNetworkAccessManager 개체가있어 쉽게 만들었습니다. 그러나 QtWebEngine의 경우 QWebEngineView 클래스에는이 기능이 없습니다. 전자는 또한 QNetworkRequest 클래스를 사용하여 모든 요청에 ​​대해 HTTP 헤더를 설정 한 다음 QWebView에서 이러한 특정 요청으로 요청을로드 할 수있었습니다. QWebEngineView로 어떻게 할 수 있습니까?

답변

6

Qt는 5.6 QWebEngineUrlRequestInterceptor 무엇 당신이 QWebEngineView 달성하려고에 대한 제안 된 솔루션 가입일 :

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); 
} 

그런 다음이 같은 특정 QWebEnginePage에 대한 QWebEngineProfile이 인터셉터에 대한 포인터를 등록해야 :

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);