2014-12-11 2 views
1

В QWebView можно было установить QNetworkCookieJar через QNetworkAccessManager.Как установить QNetworkCookieJar в QWebEngine?

QNetworkAccessManager *nam = new QNetworkAccessManager();  
nam->setCookieJar(cookieJar); 
webView->page()->setNetworkAccessManager(nam);  

Это работало как шарм.

Как установить QNetworkCookieJar в новый класс QWebEngine, представленный в Qt5.4?

+0

Вы не можете, QtWebEngine не использует QtNetworkAccessManager: http://qt-project.org/wiki/QtWebEnginePortingFromQtWebKit#c8d4911a79ee66d17426afdd9b72c767 – MrEricSir

+0

Я понимаю, что это не возможно, чтобы ввести QNetworkAccessManager в QWebEngine. Я ищу альтернативу для добавления файлов cookie в QWebEngine/QWebEnginePage. – Xaver

+0

[Да, официальный пример смешивает вещи, чтобы работать вокруг) (http://stackoverflow.com/a/27675237/2682142). – lpapp

ответ

2

Я нашел решение для совместного использования Cookies с QWebEngine и QNetworkAccesManager с помощью QWebEngineCookieStore. Подкласс QNetworkCookieJar:

class CookieWebEngine : public QNetworkCookieJar 
{ 
..... 
protected: 
    // Reimplement this functions to work with your _cookies list; 
    bool insertCookie(const QNetworkCookie &cookie); 
    bool deleteCookie(const QNetworkCookie &cookie); 
    bool updateCookie(const QNetworkCookie &cookie); 
    bool validateCookie(const QNetworkCookie &cookie, const QUrl &url) const; 
private: 
    // Save Chromium Cookies 
    QWebEngineCookieStore *_store; 
    // Save available cookies 
    QList<QNetworkCookie> _cookies; 
} 

Теперь, позволяет реализовать функцию для загрузки/сохранения куки в файле:

// Load Chromium Cookies 
void CookieWebEngine::loadStore() { 
    // Save cookies profile shared 
    QWebEngineProfile::defaultProfile()->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies); 
    _store = WebEngineProfile::defaultProfile()->cookieStore(); 
    connect(_store, &QWebEngineCookieStore::cookieAdded, this, &CookieWebEngine::handleCookieAdded); 
    _store->loadAllCookies(); 
} 
// Load/Save cookies in arraylist in a file 
void CookieWebEngine::load() { 

    // load cookies and exceptions 
    qRegisterMetaTypeStreamOperators<QList<QNetworkCookie> >("QList<QNetworkCookie>"); 
    const QString location = cookiesDirectory() + COOKIES_FILE; 
    QSettings cookieSettings(location, QSettings::IniFormat); 
    _cookies = qvariant_cast<QList<QNetworkCookie> >(cookieSettings.value(QLatin1String("cookies"))); 
    setAllCookies(_cookies); 
    // Now user iterate and add it to chromium 
    for (auto cookie : _cookies) { 
     _store->setCookie(cookie); 
    } 
    cookieSettings.sync(); 
} 

void CookieWebEngine::save() 
{ 
    QString directory = cookiesDirectory(); 
    if (!QFile::exists(directory)) { 
     QDir dir; 
     dir.mkpath(directory); 
    } 
    const QString location = directory + COOKIES_FILE; 
    QSettings cookieSettings(location, QSettings::IniFormat); 
    cookieSettings.setValue(QLatin1String("cookies"), QVariant::fromValue<QList<QNetworkCookie>>(_cookies)); 
    cookieSettings.sync(); 
} 

Теперь, просто подключить и обрабатывать печенье, загруженные из WebView:

void CookieWebEngine::handleCookieAdded(const QNetworkCookie &cookie) 
{ 
    if (insertCookie(cookie)) { 
     qDebug() << "Handle cookie " << cookie; 
    } 
} 

Его работа хорошо для меня. Теперь я использую хром для входа. После этого я сохраняю свой cookie сеанса в настраиваемом cookiejar, и я использую его в настраиваемом QNetworkAccesManager.

Смежные вопросы