【问题标题】:qt use QNetworkAccessManager couldn't get the error signalqt 使用 QNetworkAccessManager 无法获得错误信号
【发布时间】:2013-06-30 09:45:36
【问题描述】:
    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 时,我无法收到错误信号, 但是当我输入正确的网址时,我可以得到完成的信号。

这个问题的原因是什么?

【问题讨论】:

  • 1) 检查第一个connect 的返回值。 2) 将connect 调用放在get() 调用之前。
  • @Riateche 2) 是不可能的,因为get() 分配了m_preply 指针。无论如何,QNetworkAccessManager 在您将控制权返回给事件循环之前不会开始任何事情。
  • 但是我可以得到完成的信号,这可能意味着我将控制权返回给事件循环?

标签: qt qnetworkaccessmanager


【解决方案1】:

QNetworkReply 错误信号仅适用于网络层而非协议层。这意味着它将报告在与 HTTP 服务器建立连接期间发生的所有错误。建立连接后,如果 HTTP 服务器正确处理它,您将不会收到 error 信号。即使您输入的 url 产生了来自 4xx 或 5xx 状态代码的 HTTP 错误,您的回复仍然会在服务器处理您的请求时结束而没有错误(网络错误)。

如果您想处理 HTTP 错误,您必须使用带有 QNetworkReply::attribute 方法的回复属性,并将它们与使用 error 信号报告的错误分开处理

【讨论】:

  • 感谢您的回答,它对我有帮助。我还想问如果QNetworkAccessManager在主线程中不起作用,我怎么能得到信号。现在我把QNetworkAccessManager放到一个QThread中,这让我无法得到任何信号。有人告诉我QNetworkAccessManager必须在eventloop中工作?我该怎么办?
  • 您的问题与您当前的问题没有直接关系。您应该使用 QNetworkAccessManager 提出关于线程问题的新问题
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多