Я использую QtSDK 4.7.3
Я делаю это в (void test ()):
mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);
И, конечно, слот onError называется:
if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
Если у меня нет ящика сообщений / события в слоте onError, сбоя нет, и все работает. Но когда он есть, слот onError снова вызывается при вызове m.exec ().
Когда оба ящика сообщений закрыты и я оставляю функцию onError, приложение вылетает.
Приложение пытается удалить / освободить память, когда это происходит. Ошибка «Место чтения нарушения доступа» не помогает, и стек вызовов находится глубоко в библиотеках Qt.
Что я проверил:
Сигнал не подключен дважды.
Пробовал вызывать test () до и после вызова QApplication своей функции exec. (не имеет значения).
Другая ошибка, такая как HostNotFound, не вызовет слот onError дважды.
Весь мой код выполняется в основном потоке.
Попытка отсоединить слот onError, чтобы он вызывался только один раз, но все равно зависал.
Попытка прерывания вызова по запросу в onError ().
Опубликовал тот же вопрос на форуме Qt ( post ).
Может кто-нибудь помочь мне понять, что здесь происходит?
Вот код, который я использую для тестирования:
main.cpp
#include "contentnotfound.h"
#include <QtGui/QApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ContentNotFound cnf;
// false: start test after application's event loop have started
if (true) { cnf.test(); }
else { QTimer::singleShot(2000, &cnf, SLOT(test())); }
return a.exec();
}
contentnotfound.h
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMessageBox>
class ContentNotFound : public QObject
{
Q_OBJECT
public slots:
void test()
{
mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);
}
private slots:
void onError(QNetworkReply::NetworkError networkError)
{
//reply->disconnect(); // Disconnect all signals
if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
}
private:
QNetworkAccessManager* mgr;
QNetworkReply* reply;
};