2012-08-22 54 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*))); 
} 

这是我的一个方法

我试图replay-> deleteLater()的代码;但同样的结果

请咨询我可以创建一个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

你的问题是什么?结果?是“connect(nam,SIGNAL(finished(QNetworkReply *)),this,SLOT(GetUserDataCompleted(QNetworkReply *)));”位于GetUserData()和GetMessages()内?或在同一个函数内? –

+0

不是它们它们在MainWindow构造函数中看到我更新的问题 – user525717

+0

你的期望结果是什么?你目前的结果是什么?顺便说一句,你不需要连接两次,一个就足够了。但是,它不会影响结果。 –

回答

3

每个RequestSender对象将处理一个唯一的请求。在创建将要发送的QNetworkRequest时,RequestSender将使用originatingObject属性“标记”自己的请求。该属性指示哪个对象发送了请求。当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

你与你的QNetworkAccessManager将返回QNetworkReply做的每操作。这也有一个信号完成()。也许你可以将这个信号连接到不同的插槽。

相关问题