gpt4 book ai didi

c++ - 如何将 QNetworkAccessManager 移植到 WebEngine?

转载 作者:行者123 更新时间:2023-11-28 02:04:17 24 4
gpt4 key购买 nike

我知道 Qt WebEngine 不与 QNetworkAccessManager 交互。但是如何将此代码从 5.5 移植到 5.7 以使其正常工作?

QNetworkAccessManager *p =  getView()->page()->networkAccessManager();

networkAccessManager 高亮显示,错误提示“类 QWebEnginePage 没有成员 networkAccessManager”

最佳答案

我找到了一个解决方案,通过使用 QWebEngineCookieStore 与 QWebEngine 和 QNetworkAccessManager 共享 Cookie。子类 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;
}

现在,让我们实现一个函数来在文件中加载/保存 cookie:

// 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 加载的 cookie:

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

它对我来说效果很好。现在,我使用 Chromium 登录。之后,我将我的 session cookie 保存在自定义的 cookiejar 中,并在我的自定义 QNetworkAccessManager 中使用它。

你应该更新你所有的网络管理器。您可以将 QWebEnginePage 子类化并添加一个插槽来更新您的 QNetworkAccessManager 和将返回您的 NetworkAccessManager 的函数

关于c++ - 如何将 QNetworkAccessManager 移植到 WebEngine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com