2016-01-06 1 views
0

Я новичок в Qt и с помощью Qt5.5 создаю клиентское приложение http, которое загрузит окно с фиксированным URL. После входа в это окно другие окна того же сайта должны получить один и тот же сеанс. В этой цели я использовал глобальный указатель jar из QNetworkCookieJar класса и реализуется на следующий код для каждого окнаСбой приложения при использовании глобального 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

Не пытайтесь вызвать функцию setCookieJar и снова открывайте и закрывайте окна, чтобы увидеть, все еще сбой. Скорее всего, ваш код закрытия/открытия/уничтожения неверен – deW1

+0

без функции 'setCookieJar' он никогда не сбой. –

ответ

1

Из документов Qt5 (http://doc.qt.io/qt-5/qnetworkaccessmanager.html#setCookieJar):

Примечание: QNetworkAccessManager становится владельцем объекта cookieJar.

Таким образом, диспетчер доступа удалит ваш экземпляр jar. Там могут быть ваши проблемы! Я не знаю достаточно о webview/странице/accessmanager, чтобы быть уверенным в жизни менеджера, но, похоже, он связан с веб-просмотром/вашим ui, поэтому, когда он закрыт + уничтожен, ваш cookiejar тоже исчезнет ,

Как QNetworkCookieJar наследуется от QObject, вы можете использовать защищенный QPointer<QNetworkCookieJar> jar вместо простой переменной QNetworkCookieJar* jar. Затем вы заметите, что ваш защищенный указатель станет нулевым после того, как первое окно будет закрыто/уничтожено. Это будет: а) проверять мое требование из последнего абзаца и b) охранять вас от устаревших обращений к указателям в будущем (на самом деле ваша программа больше не будет терпеть крах).

0

Thanks 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); 
Смежные вопросы