2017-07-02 65 views
0

我想用QNetWorkAccessManager完成HTTP-GET,並嘗試將值傳遞給reply_finished插槽,那麼我希望得到插槽反饋到它的通話功能(例如MainWindow )。我使用https://stackoverflow.com/a/21362640/7519936 並將一個值作爲值傳遞給reply_finished插槽,但是我的應用程序崩潰了。通價值插槽和得到反饋到它的通話功能與QNetWorkAccessManager

這裏是我的MainWindow代碼:

QHash<QNetworkReply*, QString*> data_storage; 
QString data=""; 
manager = new QNetworkAccessManager(this); 
QNetworkReply* reply =manager->get(QNetworkRequest(QUrl("http://example.com"))); 
data_storage[reply] = &data; 
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(reply_Finished(QNetworkReply*))); 

reply_finshed段代碼:

void MainWindow::reply_Finished(QNetworkReply *reply) 
{ 
    data_storage.value(reply)->append("test"); 
    data_storage.remove(reply); 
    //other 
} 

請不要介意我的英語水平。 請幫助我,謝謝!

+0

什麼'data_storage.remove(回覆)'做 - 它'delete'的回答嗎?你的調試器說調用堆棧在崩潰的時候是什麼? –

+0

@ G.M。我在stackoverflow上發現了一個相同的問題,我用它的方式與我的計劃,但我的應用程序崩潰。 – xiazhanjian

+0

你在哪裏閱讀'reply'的'response'?你正在試圖將'local'變量('''')的引用存儲到'QHash'中,該''QHash''在調用'reply_finished'時將''從hash中移除。我不確定你是否首先想要的。你應該閱讀已完成的信號,然後使用它。 – Azeem

回答

2

這是一個完整的工作示例。我有這個窗口:

enter image description here

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QNetworkAccessManager> 
#include <QNetworkReply> 
#include <QString> 
#include <QHash> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private slots: 
    void on_btnSendRequest_clicked(); 

private: 
    Ui::MainWindow *ui; 

    QNetworkAccessManager    _manager; 
    QHash< QNetworkReply*, QString* > _storage; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

#include <QNetworkRequest> 
#include <QUrl> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_btnSendRequest_clicked() 
{ 
    QNetworkRequest request { QUrl{ "http://www.stroustrup.com/" } }; 
    QNetworkReply* reply = _manager.get(request); 

    QString* data = new QString{ "Test Data! " }; 

    _storage[ reply ] = data; 

    connect(&_manager, &QNetworkAccessManager::finished, 
      [this](QNetworkReply* reply) 
    { 
     if (reply->error()) 
     { 
      qWarning() << "Error:" << reply->errorString(); 
      return; 
     } 

     QString* data = _storage[ reply ]; 
     if (data) 
     { 
      const auto& appendedData = data->append("Appended data!"); 

      qDebug() << "Data:" << appendedData; 
      qDebug() << "Response:" << reply->readAll(); 

      _storage.remove(reply); 
      delete reply; 
      delete data; 
     } 
    }); 
} 

我已經使用了lambdaslotQNetworkAccessManager::finished信號。希望你能弄清楚。

在點擊按鈕Send Request,輸出將是:

數據: 「測試數據追加的數據!」
迴應: 「... www.stroustrup.com Homepage Source ...」

+0

感謝您的幫助,我試圖用你的方式,我認爲當網絡完成時我無法得到反饋,它可能會傳遞一個值(數據),但可能不會返回值(數據)給它調用函數。理解並幫助我?我的英語不好,我可能不會清楚地告訴你我的問題,請不要介意。 – xiazhanjian

+0

@ xiazhanjian:你的'data'是一個局部變量。在堆上創建它,然後按照你的方式使用它就可以了。 – Azeem

+0

感謝您的幫助! – xiazhanjian