我是Qt的新手,使用Qt5.5创建一个http客户端应用程序,它将加载一个带有固定URL的窗口。在此窗口中登录后,同一站点的其他窗口应获得相同的会话。为此,我使用了jar
类的全局指针QNetworkCookieJar
,并在每个窗口的代码上实现
Window1::Window1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Window1)
{
ui->setupUi(this);
QUrl webURL("http://someURL");
ui->webView->show();
ui->webView->load(webURL);
ui->webView->page()->networkAccessManager()->setCookieJar(jar);
}
它解决了多重身份验证问题,但当我关闭任何窗口并立即重新打开它时会导致appcrash。
请给我一个关于我的问题的建议。提前致谢。
答案 0 :(得分:1)
来自Qt5文档(http://doc.qt.io/qt-5/qnetworkaccessmanager.html#setCookieJar):
注意:QNetworkAccessManager取得cookieJar对象的所有权。
因此,accessmanager将删除您的jar
实例。可能有你的问题!我不太了解webview / page / accessmanager以确定经理的生命周期,但它似乎与webview /你的ui绑定,所以当它关闭+销毁时,你的cookiejar也会消失。
由于QNetworkCookieJar
继承自QObject,您可能希望使用受保护的QPointer<QNetworkCookieJar> jar
而不是简单的QNetworkCookieJar* jar
变量。然后,您将注意到在第一个窗口关闭/销毁后,您的受保护指针变为空。这将a)验证我在最后一段中的声明,并b)保护你不要在将来过时的指针访问(实际上,你的程序不会再崩溃)。
答案 1 :(得分:0)
谢谢 ThorngardSO .. 我找到了一个使用你答案的解决方案。这是我的解决方案,
if(jar.isNull()==true){
qDebug()<<"object null";
QPointer <QNetworkCookieJar> jar_new = new QNetworkCookieJar(0);
ui->webView->page()->networkAccessManager()->setCookieJar(jar_new);
jar=jar_new;
}
else
ui->webView->page()->networkAccessManager()->setCookieJar(jar);