Проблема QNetworkAccessManager

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 обновит его. Что может быть решением подождать, пока работа не будет завершена, чтобы я мог получить правильную информацию, не пропуская ее и возвращая что-то еще. Спасибо.

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;

}
Другие вопросы по тегам