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

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

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

【问题讨论】:

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

标签: c++ qt qt5 qnetworkaccessmanager qhttp


【解决方案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 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      相关资源
      最近更新 更多