Я нашел решение для совместного использования 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.
Вы не можете, QtWebEngine не использует QtNetworkAccessManager: http://qt-project.org/wiki/QtWebEnginePortingFromQtWebKit#c8d4911a79ee66d17426afdd9b72c767 – MrEricSir
Я понимаю, что это не возможно, чтобы ввести QNetworkAccessManager в QWebEngine. Я ищу альтернативу для добавления файлов cookie в QWebEngine/QWebEnginePage. – Xaver
[Да, официальный пример смешивает вещи, чтобы работать вокруг) (http://stackoverflow.com/a/27675237/2682142). – lpapp