Qt WebEngineはQNetworkAccessManagerと対話しないことがわかりました。しかし、このコードを5.5から5.7に移植するにはどうすればよいでしょうか?QNetworkAccessManagerをWebEngineに移植する方法は?
QNetworkAccessManager *p = getView()->page()->networkAccessManager();
networkAccessManagerがhighlitedされ、エラーが
Qt WebEngineはQNetworkAccessManagerと対話しないことがわかりました。しかし、このコードを5.5から5.7に移植するにはどうすればよいでしょうか?QNetworkAccessManagerをWebEngineに移植する方法は?
QNetworkAccessManager *p = getView()->page()->networkAccessManager();
networkAccessManagerがhighlitedされ、エラーが
多分これは役立ちます "クラス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*)));
説明する方法はありませんが、QtWebKitを5.5.1から5.7に持っていくことは可能です。コンパイルオプションには「微調整」が必要ですが、実際には難しくないQMLサポートを含む非常に安定しています。
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を返す機能を追加することができます。
「Qt WebEngineはQNetworkAccessManagerとやりとりしません。実際に何を達成しようとしていますか? – MrEricSir
QNetworkとWebEngineが相互にやり取りしないので、これらのようなネットワーク要求を送信する他の方法があるかどうかを知りたいでしょうか? –
移植すると、なぜQNetworkAccessManagerへのポインタを取得する必要がありますか? QNetworkAccessManagerはコードから消えるべきではないでしょうか? –