2013-06-30 3 views
0
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을 입력하면 완료 신호를받을 수 있습니다.qt use QNetworkAccessManager가 오류 신호를 수신하지 못했습니다.

이 질문에 대한 이유는 무엇입니까?

+0

1) 최초의'connect'의 반환 값을 확인하여보고 된 오류를 별도로 처리합니다. 2)'get()'호출 전에'connect' 호출을합니다. –

+1

@Riateche 2)'get()'이'm_preply' 포인터를 할당하기 때문에 불가능합니다. 어쨌든'QNetworkAccessManager'는 이벤트 루프로 제어권을 반환하기 전에는 아무것도 시작하지 않습니다. – alexisdm

+0

하지만 이벤트 신호를 제어 할 수있는 신호를 얻을 수 있습니까? – lvshuchengyin

답변

0

QNetworkReply 오류 신호는 네트워킹 계층이 아닌 프로토콜 계층에만 해당됩니다. 즉, HTTP 서버와의 연결을 설정하는 동안 발생한 모든 오류를보고합니다. 연결이 설정되면 HTTP 서버가 올바르게 처리하면 error 신호를받지 못합니다. 4xx 또는 5xx 상태 코드에서 작성한 URL을 입력 한 경우에도 서버가 요청을 처리 할 때 오류 (네트워크 오류)없이 응답이 종료됩니다.

당신이 응답이 QNetworkReply::attribute 방법과 속성을 사용해야합니다 HTTP 오류를 처리하고 error 신호

+0

답변 해 주셔서 감사합니다. 또한 QNetworkAccessManager가 주 스레드에서 작동하지 않는지 묻고 싶습니다. 어떻게 신호를받을 수 있습니까? 이제 QNetworkAccessManager를 QThread에 넣으십시오. 그러면 신호가 나지 않습니다. QNetworkAccessManager가 eventloop에서 작동해야한다고 말합니까? 어떻게해야합니까? – lvshuchengyin

+1

귀하의 질문은 귀하의 현재 문제와 직접적인 관련이 없습니다. QNetworkAccessManager –

+0

으로 스레드 문제에 대한 새로운 질문을 만들어야합니다. 다시 물어볼 것입니다. – lvshuchengyin

관련 문제