Qt QNetworkAccessManager 和多个 QNetworkReply

Posted

技术标签:

【中文标题】Qt QNetworkAccessManager 和多个 QNetworkReply【英文标题】:Qt QNetworkAccessManager and multiple QNetworkReply 【发布时间】:2012-08-22 16:09:58 【问题描述】:

我有两个获取 QNetworkRequest。

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

例如这是

中的代码
  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();但结果相同

请给我一些有用的建议

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

【问题讨论】:

您的问题是什么?结果?是 "connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(GetUserDataCompleted(QNetworkReply*)));"位于 GetUserData() 和 GetMessages() 内?或者在同一个函数内? 不,它们在 MainWindow 构造函数中,请参阅我更新的问题 您的预期结果是什么?你目前的结果是什么?顺便说一句,您不需要连接两次,一次就足够了。但是,它不会影响结果。 【参考方案1】:

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

每个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。这也有一个信号finished()。也许您可以将此信号连接到您的不同插槽。

【讨论】:

以上是关于Qt QNetworkAccessManager 和多个 QNetworkReply的主要内容,如果未能解决你的问题,请参考以下文章

QT 从 QWebView 的 QNetworkAccessManager 读取数据

Qt同步QNetworkAccessManager获取

QT中的QNetworkAccessManager可靠连接

使用 QNetworkAccessManager 的 Qt 控制台应用程序

Qt无法打开包含文件:'QNetworkAccessManager':没有这样的文件或目录

在 Qt 中使用 QNetworkAccessManager 的持久连接