Qt QNetworkAccessManager and multiple QNetworkReply

匆匆过客 提交于 2019-12-06 11:20:05

问题


I have two get QNetworkRequest.

I want to handle finished signals from different methods.

For example this is code in

  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*)));
}

This my one method

I have tried replay->deleteLater(); but same result

Please advice me something useful

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();
        }
    }
}

回答1:


You can create a RequestSender class whose role is looking after requests.

Each RequestSender object will handle one unique request. While creating the QNetworkRequest that will be sent, the RequestSender will "tag" its own request with the originatingObject attribute. This attribute indicates which object sent the request. When a RequestSender object receives a reply, it will look if it is the sender of the request via the originatingObject attribute. For further informations about originatingObject, you can refer to the documentation here : http://qt-project.org/doc/qt-4.8/qnetworkrequest.html#originatingObject

Below is an example of what you can do.

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:


Every operation you do with your QNetworkAccessManager will return a QNetworkReply. This has also has an signal finished(). Maybe you can connect this signal to your different slots.



来源:https://stackoverflow.com/questions/12077211/qt-qnetworkaccessmanager-and-multiple-qnetworkreply

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!