在多个窗口中使用全局QNetworkCookieJar时,应用程序崩溃

Application crashes when using global QNetworkCookieJar for multiple windows

本文关键字:QNetworkCookieJar 应用程序 崩溃 全局 窗口      更新时间:2023-10-16

我是Qt的新手,正在使用Qt5.5创建一个http客户端应用程序,该应用程序将加载一个具有固定URL的窗口。在该窗口登录后,同一站点的其他窗口应该会获得相同的会话。为此,我使用了QNetworkCookieJar类的全局指针jar,并在以下代码中为每个窗口实现

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。

请就我的问题给我一个建议。提前谢谢。

来自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)防止您在未来访问过时的指针(事实上,您的程序将不再崩溃)。

感谢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);
相关文章:
  • 没有找到相关文章