如何将QNetworkAccessManager移植到WebEngine?

时间:2016-07-05 18:36:33

标签: c++ qt

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

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

networkAccessManager是highlited,错误说"类QWebEnginePage没有成员networkAccessManager"

3 个答案:

答案 0 :(得分:2)

我找到了一个解决方案,使用QWebEngineCookieStore与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;
    }
}

它对我有用。现在,我使用chrome登录。之后,我将会话cookie保存在自定义的cookiejar中,并在我的自定义QNetworkAccesManager中使用它。

您应该更新所有网络管理员。你可以我继承QWebEnginePage并添加一个插槽来更新你的QNetworkAccesManager和将返回你的NetworkAccesManager的函数

答案 1 :(得分:0)

也许这会有所帮助:

  

Qt WebEngine不与QNetworkAccessManager交互

     

像QAuthenticator这样的Qt网络的一些类被重用了   但是,与Qt WebKit不同,Qt WebEngine有自己的HTTP   实现并且无法通过QNetworkAccessManager。

仍支持QNetworkAccessManager的信号和方法已移至QWebEnginePage类。

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(QNetworkReply*,QAuthenticator*)), this, SLOT (authenticate(QNetworkReply*,QAuthenticator*)));

秒。 https://wiki.qt.io/Porting_from_QtWebKit_to_QtWebEngine

答案 2 :(得分:0)

没有办法以你描述的方式移植它,但是可以将QtWebKit从5.5.1带到5.7 ..它需要在编译选项中进行一些“微调”但是它并不是很难并且工作非常稳定包括QML支持。