2016-07-05 8 views
0

Qt WebEngineはQNetworkAccessManagerと対話しないことがわかりました。しかし、このコードを5.5から5.7に移植するにはどうすればよいでしょうか?QNetworkAccessManagerをWebEngineに移植する方法は?

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

networkAccessManagerがhighlitedされ、エラーが

+0

「Qt WebEngineはQNetworkAccessManagerとやりとりしません。実際に何を達成しようとしていますか? – MrEricSir

+0

QNetworkとWebEngineが相互にやり取りしないので、これらのようなネットワーク要求を送信する他の方法があるかどうかを知りたいでしょうか? –

+0

移植すると、なぜQNetworkAccessManagerへのポインタを取得する必要がありますか? QNetworkAccessManagerはコードから消えるべきではないでしょうか? –

答えて

0

多分これは役立ちます "クラスQWebEnginePageは何のメンバーnetworkAccessManagerありません" と言う:

QtのWebEngineは

QNetworkAccessManager

でのQtのいくつかのクラスは相互作用しないがQAuthenticatorのようなネットワークは インターフェイスで再利用されましたが、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

0

説明する方法はありませんが、QtWebKitを5.5.1から5.7に持っていくことは可能です。コンパイルオプションには「微調整」が必要ですが、実際には難しくないQMLサポートを含む非常に安定しています。

1

QWebEngineCookieStoreを使用してQWebEngineとQNetworkAccesManagerとCookieを共有するという解決策が見つかりました。サブクラスQNetworkCookieJar:

// 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; 
    } 
} 

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をカスタマイズされたCookiejarに保存し、カスタマイズしたQNetworkAccesManagerで使用します。

すべてのネットワークマネージャを更新する必要があります。 QWebEnginePageをサブクラス化し、QNetworkAccesManagerを更新するスロットとNetworkAccesManagerを返す機能を追加することができます。

関連する問題