我是 Qt 的新手。我为VS2008安装了Qt并与我的 VS2010 集成。我只是想知道如何发出HTTP请求。我读过关于 QtNetwork 的信息,但是QtHttp很有用。
我也知道 libcurl 和 curlpp ,但我在安装它时遇到了问题,并使其与Qt一起使用。
您推荐什么, QtNetwork 或 curlpp ?如果 QtNetwork ,您能否给我一个示例函数或一段代码(以及要使用的类)。如果 curlpp(libcurl),您能否指点我找到安装 Qt (或善解释)的步骤?
非常感谢。
答案 0 :(得分:6)
libcurl 和 curlpp 是很棒的库,但使用它们会为您的项目添加依赖项,这可能是您可以避免的。
最近的Qt版本建议使用QNetworkAccessManager
发出网络请求(包括http请求)并接收回复。
下载文件的最简单方法是:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));
调用replyFinished
插槽时,作为参数的QNetworkReply
对象将包含下载的数据以及元数据(标题等)。
可以在Qt示例中找到更完整的示例,您可以read here its source code。
答案 1 :(得分:5)
Giuseppe是对的,您不需要使用 libcurl , curlpp 和类似的库。 没有必要,Qt有一个简单的工作级别。
请记住,发送请求和检索回复的标准方式是异步的。 您始终必须将经理完成(QNetworkReply *)信号连接到插槽。
如果发送多个请求并且不想为每个回复添加一个插槽,则可以始终运行事件循环,并将管理器信号连接到事件循环quit()插槽。
这样的事情:
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
顺便说一下。不知道你在做什么。但如果它是一个移动应用程序,我会建议你从VS切换到QtCreator IDE。它有一个很好的模拟器和一个完整的移动设备测试工具链。