将全局QNetworkCookieJar用于多个窗口时,应用程序崩溃

时间:2016-01-06 12:31:55

标签: c++ qt

我是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。

请给我一个关于我的问题的建议。提前致谢。

2 个答案:

答案 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);