Meu qhttp get () chamada não funciona no Windows, mas não no Linux
Pergunta
Eu escrevi um programa que usa qhttp para obter uma página web. Esta multa funciona em Linux, mas não funciona na minha caixa de Windows (Vista). Parece que o sinal qhttp feito nunca é recebido.
O código relevante é:
Window::Window()
{
http = new QHttp(this);
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
url = new QUrl("http://something.com/status.xml");
http->setHost(url->host(), url->port() != -1 ? url->port() : 80);
if (!url->userName().isEmpty()) http->setUser(url->userName(), url->password());
}
void Window::retrievePage()
{
byteArray = new QByteArray;
result = new QBuffer(byteArray);
result->open(QIODevice::WriteOnly);
httpRequestAborted = false;
httpGetId = http->get(url->path(), result);
}
void Window::httpDone(bool error)
{
//Never gets here!
}
Qualquer ajuda seria appriecated.
Matt
Solução
Isso não deve acontecer em todos, ou seja QHttp funciona de forma confiável tanto em Windows e Unix.
O meu conselho é verificar se os saques dá resposta adequada. Isto pode ser feito, por exemplo, verificando que a transferência de dados é muito bem. Você pode rastrear o status de sinal de QHttp, por exemplo, dataReadProgress , requestStarted , requestFinished , e outros sinais relacionados.
Por outro lado, em vez de usar QHttp velho, por que não usar o recomendado QNetworkAccessManager em vez disso? Para obter seus pés molhados rapidamente, verifique um exemplo que eu postei a Qt Labs há algum tempo: visualizador de imagens com URL remoto suporte drag-and-drop . Ele usa o disse QNetworkAccessManager para agarrar a imagem da queda URL. Verifique a código-fonte , é apenas 150 linhas.
Outras dicas
reescrita como sugerido por Ariya usar QNetworkAccessManager e olhando para este exemplo
Este agora funciona em Windows e Linux.
Window::Window()
{
connect(&manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(retrieveData(QNetworkReply*)));
}
void Window::retrieveMessage()
{
manager.get(QNetworkRequest(QUrl("http://...")));
}
void Window::retrieveData(QNetworkReply *reply)
{
QVariant statusCodeV =
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
// "200 OK" received?
if (statusCodeV.toInt()==200)
{
QByteArray bytes = reply->readAll(); // bytes
}
reply->deleteLater();
}