QHttp 在 Qt5 中不可用

Posted

技术标签:

【中文标题】QHttp 在 Qt5 中不可用【英文标题】:QHttp in not available in Qt5 【发布时间】:2014-10-03 13:54:46 【问题描述】:

我注意到 QHttp 类在 Qt5 中不再可用,并且我不断收到一条错误消息,提示我需要使用 QNetworkAccessManager 来执行此操作。

有没有办法在 Qt5 中访问这个类?

【问题讨论】:

是的,您需要使用 QNetworkAccessManager(首选)或使用兼容性插件 QtHttp,它提供 Qt4 中的 QHttp 类。 谢谢,但我不明白“怎么做”。我只是一个学习者。 这取决于你想做什么。您需要尝试编写一些代码,然后提交代码才能在此处获得帮助。 好的,但如果我想使用兼容性插件 QtHttp,它提供 QHttp 类,就像它在 Qt4 中一样。它是像一个包含的头文件还是添加到 user.pro 文件中。 检查this 主题。它解释了如何安装兼容性插件。 【参考方案1】:

在 Qt 5 中使用QNetworkAccessManager。您可以使用事件循环等待回复完成,然后读取可用字节:

QString My_class::My_Method()


   QNetworkAccessManager manager;

   QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(myURL)));

   QEventLoop loop;
   connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
   connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
   loop.exec();

   QByteArray bts = reply->readAll();
   QString str(bts);

   delete reply;

   return str;


您也可以通过将QNetworkAccessManagerfinished 信号连接到插槽来以异步方式执行此操作:

connect(&manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onFinished(QNetworkReply*)));

并在那里读取数据:

void onFinished(QNetworkReply* reply)


   if (reply->error() == QNetworkReply::NoError)
   
       QByteArray bts = reply->readAll();

       ...
   

【讨论】:

【参考方案2】:

这是一个简单的 HTTP 帖子(我使用的是 Qt 5.3.2)

int Connection::postRequest(QString requestType, QUrl params)
    QString params_array = params.query();

    QNetworkRequest request(user->url);
    request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(params_array.size()));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    QEventLoop waitLoop;
    QNetworkAccessManager* connection = new QNetworkAccessManager(/*`this` can also be passed*/);
    QNetworkReply* reply = connection->post(request, params_array.toUtf8());
    QObject::connect(reply, SIGNAL(finished()), &waitLoop, SLOT(quit()));
    waitLoop.exec();

    int errorCode = reply->error();
    if (errorCode != 0)
        // Show Error Message
    
    else
        // Parse "reply"
    

    delete reply;
    delete connection;
    return errorCode;

【讨论】:

你也可以发布你的等待循环吗?【参考方案3】:

假设您不需要维护庞大的代码库,正确的方法是改用新的QNetworkAccessManager 类。

【讨论】:

以上是关于QHttp 在 Qt5 中不可用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt5 中检查 url 是不是可用?

Lua - “系统”不可用:在 iOS 中不可用

为啥“事件”在 Chrome 中全局可用,但在 FF 中不可用?

为啥这个 Javascript 库在浏览器中可用,但在 PhoneGap 中不可用?

为啥 XML 存储在 iOS 中不可用?

为啥 IndexedDB 在 node.js 中不可用? [关闭]