如何将QNetworkAccessManager移植到WebEngine
How to port QNetworkAccessManager to WebEngine?
我知道Qt WebEngine不与QNetworkAccessManager交互。但是,如何将这些代码从5.5移植到5.7才能使其正常工作呢?
QNetworkAccessManager *p = getView()->page()->networkAccessManager();
networkAccessManager被高亮显示,错误提示"类qwebengineepage没有成员networkAccessManager"
我找到了一个解决方案,通过使用qwebengineecookiestore与QWebEngine和QNetworkAccesManager共享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来登录。之后,我将会话cookie保存在定制的cookiejar中,并在自定义的QNetworkAccesManager中使用它。
你应该更新你所有的网络管理器。你可以子类化qwebengineepage并添加一个插槽来更新你的QNetworkAccesManager和函数,它将返回你的NetworkAccesManager
也许这有帮助:
Qt WebEngine不与QNetworkAccessManager交互
Qt网络的一些类,如QAuthenticator,被重新使用接口,但与Qt WebKit不同,Qt WebEngine有自己的HTTP实现,不能通过QNetworkAccessManager。的仍然支持QNetworkAccessManager的信号和方法被移到qwebengineepage类。
Qt WebKit:
QNetworkAccessManager qnam;
QWebPage page;
page.setNetworkAccessManager(&qnam);
connect(&qnam, SIGNAL (authenticationRequired(QNetworkReply*, QAuthenticator*)), this, SLOT (authenticate(QNetworkReply*, QAuthenticator*)));
Qt WebEngine:
QWebEnginePage page;
connect(&page, SIGNAL (authenticationRequired(QUrl, QAuthenticator*)), this, SLOT (authenticate(QUrl, QAuthenticator*)));
来源:https://wiki.qt.io/Porting_from_QtWebKit_to_QtWebEngine
没有办法按照你描述的方式移植它,但是有可能将QtWebKit从5.5.1带到5.7..它需要在编译选项中进行一些"微调",但这并不难,而且在包括QML支持在内的情况下工作非常稳定。