4

QNetworkRequest を 2 つ取得しています。

さまざまなメソッドからの完成したシグナルを処理したい。

たとえば、これはコードです

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

2 に答える 2

6

RequestSenderリクエストを処理するロールを持つクラスを作成できます。

RequestSenderオブジェクトは、1 つの固有の要求を処理します。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
}
于 2012-08-23T02:51:58.560 に答える
2

QNetworkAccessManagerで行うすべての操作は、QNetworkReplyを返します。これには、finished()というシグナルもあります。たぶん、あなたはこの信号をあなたの異なるスロットに接続することができます。

于 2012-08-23T17:28:49.253 に答える