首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt QNetworkAccessManager和多QNetworkReply

Qt QNetworkAccessManager和多QNetworkReply
EN

Stack Overflow用户
提问于 2012-08-23 00:09:58
回答 2查看 4.1K关注 0票数 3

我有两个get QNetworkRequest。

我想要处理来自不同方法的完成的信号。

例如,这是下面的代码

代码语言:javascript
复制
  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();但同样的结果

请给我一些有用的建议

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-23 10:51:59

您可以创建一个RequestSender类,该类的角色是处理请求。

每个RequestSender对象将处理一个唯一的请求。在创建将要发送的QNetworkRequest时,RequestSender将用originatingObject属性“标记”它自己的请求。此属性指示哪个对象发送了请求。当RequestSender对象收到回复时,它将通过originatingObject属性查看它是否是请求的发送者。有关originatingObject的更多信息,请参阅此处的文档:http://qt-project.org/doc/qt-4.8/qnetworkrequest.html#originatingObject

以下是您可以执行的操作的示例。

requestsender.hpp:

代码语言:javascript
复制
class RequestSender {
    public:
        RequestSender();
        ~RequestSender();
        void createRequest(/* Request parameters */);

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

requestsender.cpp:

代码语言:javascript
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2012-08-24 01:28:49

您对QNetworkAccessManager执行的每个操作都将返回一个QNetworkReply。这也有一个信号finished()。也许您可以将此信号连接到您的不同插槽。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12077211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档