2012-08-22 3 views
2

두 개의 QNetworkRequest가 있습니다.Qt QNetworkAccessManager 및 여러 QNetworkReply

다른 방법으로 완성 된 신호를 처리하고 싶습니다.

예를 들어이

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    GetUserData(); 
    connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(GetUserDataCompleted(QNetworkReply*))); 

    GetMessages(); 
    connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(GetMessagesCompleted(QNetworkReply*))); 
} 

내가> deleteLater replay- 시도

이 내 하나의 방법()의 코드; 그러나 같은 결과

나에게 당신은 역할 요청 후 찾고 있습니다 RequestSender 클래스를 만들 수 있습니다

void MainWindow::GetUserDataCompleted(QNetworkReply *replay) 
{ 
    if(replay->error() == QNetworkReply::NoError) 
    { 
     QString getData = replay->readAll(); 
     QMessageBox msg; 

     if(getData == "1") 
     { 
      msg.setText("User Is not Exits"); 
     } 
     else 
     { 
      QDomDocument doc; 

      if(doc.setContent(getData)) 
      { 
       QDomElement domElem = doc.documentElement(); 

       QDomNode n = domElem.firstChild(); 
       while(!n.isNull()) { 
        QDomElement e = n.toElement(); // try to convert the node to an element. 
        if(!e.isNull()) { 
         msg.setText(e.namedItem("Image").childNodes().at(0).nodeValue()); 
         msg.exec(); 
        } 
        n = n.nextSibling(); 
       } 
      } 

      replay->deleteLater(); 
     } 
    } 
} 
+0

무엇이 당신의 질문입니까? 결과? "연결 (nam, SIGNAL (finished (QNetworkReply *)), this, SLOT (GetUserDataCompleted (QNetworkReply *)));" GetUserData() 및 GetMessages() 안에 있습니까? 또는 같은 기능 안에서? –

+0

해당 없음 MainWindow 생성자 안에 있습니다. 업데이트 된 질문보기 – user525717

+0

예상되는 결과는 무엇입니까? 그리고 현재의 결과는 무엇입니까? Btw, 두 번 연결할 필요는 없습니다. 하나이면 충분합니다. 그러나 결과에 영향을주지 않습니다. –

답변

3

뭔가 유용한 조언을 주시기 바랍니다.

RequestSender 개체는 하나의 고유 한 요청을 처리합니다. 전송 될 QNetworkRequest을 생성하는 동안 RequestSenderoriginatingObject 속성을 사용하여 자체 요청에 "태그"를 지정합니다. 이 속성은 요청을 보낸 객체를 나타냅니다. RequestSender 개체가 회신을 받으면 originatingObject 특성을 통해 요청을 보낸 사람인지 확인합니다. originatingObject에 대한 자세한 내용은 여기에서 설명서를 참조하십시오. http://qt-project.org/doc/qt-4.8/qnetworkrequest.html#originatingObject

다음은 수행 할 수있는 작업의 예입니다.

requestsender.hpp :

class RequestSender { 
    public: 
     RequestSender(); 
     ~RequestSender(); 
     void createRequest(/* Request parameters */); 

    public slots: 
     void endRequest(QNetworkReply* replay); 
}; 

requestsender.cpp :

RequestSender::RequestSender() { 
    connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(endRequest(QNetworkReply*))); 
} 

RequestSender::~RequestSender() { 
    disconnect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(endRequest(QNetworkReply*))); 
} 

void RequestSender::createRequest(/* Request parameters */) { 
    QNetworkRequest * myRequest = 0; 

    // Build myRequest with the request parameters 

    myRequest->setOriginatingObject(this); 
    nam->get(*myRequest); 

} 

void RequestSender::endRequest(QNetworkReply* replay) { 
    if (replay->request().originatingObject() != this) { 
     // That's not the request sent by the object -> stop the method here ! 
     return; 
    } 

    // Treatments on replay 
} 
2

당신이 QNetworkReply을 반환됩니다 QNetworkAccessManager와 함께 할 모든 작업. 이것은 또한 신호가 완료되었습니다(). 어쩌면이 신호를 다른 슬롯에 연결할 수 있습니다.

관련 문제