Hace peticiones HTTP en Qt
-
26-09-2019 - |
Pregunta
soy nuevo en Qt . He instalado Qt para VS2008 e integrado con mi VS2010 . Sólo quiero saber cómo hacer peticiones HTTP. He leído acerca de QtNetwork , pero QtHttp es obsoleto.
También sabe acerca de libcurl y curlpp , pero tengo problemas con la instalación, y lo que es trabajar con Qt.
¿Qué recomiendas, QtNetwork o curlpp ? Si QtNetwork , puede usted por favor dame una función de ejemplo o una pieza de código (y qué clase que se utiliza). Si curlpp (libcurl) , puede usted por favor me punto a algún lugar donde puedo encontrar los pasos para instalarlo para Qt (o la amabilidad de explicar)?
Muchas gracias.
Solución
libcurl y curlpp son grandes bibliotecas, pero su uso se agrega una dependencia a su proyecto que, probablemente, se puede evitar.
Las versiones recientes de Qt recomienda usar QNetworkAccessManager
para hacer solicitudes de red ( incluidas las peticiones HTTP) y recibir respuestas.
La forma más sencilla posible descargar un archivo es:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));
Cuando la ranura Un ejemplo más completo se puede encontrar en los ejemplos de Qt, puede leer aquí su código fuente . replyFinished
se llama, el href="http://doc.qt.nokia.com/4.7/qnetworkreply.html" rel="nofollow noreferrer"> QNetworkReply
objeto
Otros consejos
Giuseppe es correcto, no es necesario el uso de libcurl , curlpp y bibliotecas similares. No hay necesidad de eso, Qt tiene una clase simple y trabajar en él posee.
Tenga en cuenta que la manera estándar de enviar la solicitud y la recuperación de la respuesta es asíncrona. Siempre hay que conectar la señal de acabado (QNetworkReply *) gerente de una ranura.
Si envía múltiples peticiones y no desea añadir una ranura para cada respuesta, siempre se puede ejecutar un bucle de eventos, y conectar la señal de los administradores a los bucles de eventos quit () ranura.
Algo como esto:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QEventLoop *eventLoop = new QEventLoop();
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), eventLoop, SLOT(quit());
manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));
eventLoop->exec(QEventLoop::ExcludeUserInputEvents);
QByteArray replyData = reply->readAll();
... //do what you want with the data your receive from reply
Por cierto. no sabe lo que está haciendo. Pero si es una aplicación móvil, le recomiendo que cambia de VS a QtCreator IDE. Tiene un simulador agradable y un conjunto de herramientas completo para pruebas de dispositivos móviles.