qt использует QNetworkAccessManager, не может получить сигнал ошибки

    m_request.setUrl(pDownloadInfo->url);
    m_preply = pManager->get(m_request);

    QObject::connect(m_preply, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(DownloadError(QNetworkReply::NetworkError)));
    QObject::connect(m_preply, SIGNAL(finished()), this, SLOT(ReadyRead()));

Я использую qt5.0 и использую QNetworkAccessManager для загрузки файла http. Я не мог получить сигнал об ошибке, когда вводил неверный URL-адрес, который не был правильным, но я могу получить готовый сигнал, когда вводил правильный URL-адрес.

Какова причина этого вопроса?


person lvshuchengyin    schedule 30.06.2013    source источник
comment
1) Проверьте возвращаемое значение первого connect. 2) Поместите connect вызовов перед get() вызовом.   -  person Pavel Strakhov    schedule 30.06.2013
comment
@Riateche 2) невозможно, поскольку get() выделяет указатель m_preply. И вообще, QNetworkAccessManager ничего не запустит, пока вы не вернете управление в цикл обработки событий.   -  person alexisdm    schedule 30.06.2013
comment
Но я могу получить готовый сигнал, это может означать, что я возвращаю управление в цикл событий?   -  person lvshuchengyin    schedule 01.07.2013


Ответы (1)


QNetworkReply сигнал ошибки относится только к сетевому уровню, а не к уровню протокола. Это означает, что он будет сообщать обо всех ошибках, возникших при установлении соединения с HTTP-сервером. Когда соединение установлено, вы не получите сигнал error, если HTTP-сервер обработал его правильно. Даже если введенный вами URL-адрес вызвал ошибки HTTP из кодов состояния 4xx или 5xx, ваш ответ будет завершен без ошибки (ошибка сети), поскольку сервер обработал ваш запрос.

Если вы хотите обрабатывать ошибки HTTP, вы должны использовать атрибуты ответа с QNetworkReply: :attribute и обрабатывать их отдельно от ошибок, о которых сообщает сигнал error.

person Kamil Klimek    schedule 01.07.2013
comment
Спасибо за ваш ответ, он мне помогает. Я также хочу спросить, не работает ли QNetworkAccessManager в основном потоке, как я могу получить сигнал. Теперь я помещаю QNetworkAccessManager в QThread, из-за чего я не могу получить никакого сигнала. Некоторые люди говорят мне, что QNetworkAccessManager должен работать в цикле событий? Что я должен делать? - person lvshuchengyin; 03.07.2013
comment
Ваш вопрос не имеет прямого отношения к вашей текущей проблеме. Вы должны создать новый вопрос о вашей проблеме с потоками с помощью QNetworkAccessManager. - person Kamil Klimek; 03.07.2013