2014-06-18 4 views
1
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()를 호출 할 때이 ReplayFinished 그것을 업데이트 할 때까지 기다리지 않고 그런 식으로 반환 된 때문에 QString str가 비어 있다는 것입니다. 작업이 완료 될 때까지 기다려야하는 솔루션이 될 수 있으므로 적절한 정보를 얻을 수 있으므로 건너 뛰거나 다른 것을 반환하지 않아도됩니다. 감사합니다.QNetworkAccessManager 문제

+0

은 사용 하시겠습니까을 (HTTP : //developer.nokia.com/community/wiki/How_to_wait_synchronously_for_a_Signal_in_Qt) 그런 다음 당신의 솔루션이 제대로 작동하는 것 같습니다. 왜 당신이 선언했거나 나중에 어디서나 사용되는 것을 보지 못하기 때문에'My_Method'에서 문자열을 반환하는 이유를 모르겠습니다. –

+0

그것은 내가 말했듯이 .h 파일에 선언되어있다. –

답변

1

당신은 가능한 바이트를 읽어 다음 응답이 완료 될 때까지 기다려야하고 이벤트 루프를 사용하여 문자열을 반환 할 수 있습니다 [? QNetworkAccessManager이 :: 동기 방식으로 얻을]

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; 

} 
+0

나는이 해결책이 충분하다고 생각하지 않는다. 오류 발생시 어떻게됩니까? Qt 문서는 "완료된"신호는 "** 아마도 ** 따라갈 것"이라고 말하지만 그렇지 않은 경우 이벤트 루프가 전혀 종료되지 않습니다. 게다가'manager'와'reply' 객체를 지우는 것이 좋습니다. – vahancho

+0

@vahancho 당신 말이 맞아요. 나는 약간의 변화를 가했다. – Nejat

+0

Nejat 및 Vahancho 모두 감사합니다. D –

관련 문제