【问题标题】:QNetworkAccessManager issueQNetworkAccessManager 问题
【发布时间】:2014-08-08 17:13:35
【问题描述】:
QString My_class::My_Method()
{
    QNetworkAccessManager *manager= new QNetworkAccessManager(this);
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(ReplayFinished(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl(My_URL)));
    return str;
}

void My_class::ReplayFinished(QNetworkReply *replay)
{
    QString buffer;
    if(replay->isOpen())
    {
        buffer=replay->readAll();
//treatment on the buffer and the public Qstring 'str'(declared in My_class.h) is updated
    }
}

嗨, 问题是在主调用 My_method() 时,QString str 是空的,因为它以这种方式返回,而无需等待 ReplayFinished 更新它。 等待工作完成的解决方案可能是什么,以便我可以获得正确的信息,而不是跳过它并返回其他内容。 谢谢。

【问题讨论】:

  • 你想使用QNetworkAccessManager::get in synchronous manner? 其他然后你的解决方案似乎工作正常。不知道你为什么要从My_Method 返回一个字符串,因为我没有看到它在以后的任何地方声明或使用。
  • 如我所说,它已在 .h 文件中声明 :)

标签: c++ qt httprequest qnetworkaccessmanager get-request


【解决方案1】:

您可以使用事件循环等待回复完成,然后读取可用字节并返回字符串:

QString My_class::My_Method()
{

   QNetworkAccessManager manager;

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

   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;

}

【讨论】:

  • 我认为这个解决方案还不够好。错误会发生什么? Qt 文档说finished 信号“将可能跟随”,但如果不是,那么您的事件循环将根本不会退出。此外,最好在之后删除managerreply 对象。
  • 谢谢 Nejat 和 vahancho :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
相关资源
最近更新 更多