Qt 通过QNetWorkAccessManager将值传递给插槽并获取对其调用函数的反馈

Qt 通过QNetWorkAccessManager将值传递给插槽并获取对其调用函数的反馈,qt,qt-signals,qtnetwork,Qt,Qt Signals,Qtnetwork,我想使用QNetWorkAccessManager来完成HTTP-GET,并尝试将一个值传递给reply\u finished插槽,然后我希望从该插槽获得对其调用功能的反馈(例如main window) 并将一个点作为值传递给reply\u finished插槽,但我的应用程序崩溃了 这是我的主窗口代码: QHash<QNetworkReply*, QString*> data_storage; QString data=""; manager = new QNe

我想使用
QNetWorkAccessManager
来完成
HTTP-GET
,并尝试将一个值传递给
reply\u finished
插槽,然后我希望从该插槽获得对其调用功能的反馈(例如
main window
) 并将一个点作为值传递给
reply\u finished
插槽,但我的应用程序崩溃了

这是我的
主窗口
代码:

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*)));
请不要介意我的英语。
请帮帮我,谢谢

下面是一个完整的工作示例。我已经打开了这个窗口:

main window.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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
专用插槽:
单击“”时无效;
私人:
Ui::MainWindow*Ui;
QNetworkAccessManager\u管理器;
QHash\u存储;
};
#endif//main窗口
main window.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;
        }
    });
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在\u btnSendRequest\u单击时()
{
QNetworkRequest请求{QUrl{”http://www.stroustrup.com/" } };
QNetworkReply*reply=\u manager.get(请求);
QString*data=新的QString{“测试数据!”};
_存储[应答]=数据;
连接(&_管理器,&QNetworkAccessManager::已完成,
[此](QNetworkReply*回复)
{
如果(回复->错误())
{
qWarning()追加(“追加的数据!”);

qDebug()这是一个完整的工作示例。我有以下窗口:

main window.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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
专用插槽:
单击“”时无效;
私人:
Ui::MainWindow*Ui;
QNetworkAccessManager\u管理器;
QHash\u存储;
};
#endif//main窗口
main window.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;
        }
    });
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在\u btnSendRequest\u单击时()
{
QNetworkRequest请求{QUrl{”http://www.stroustrup.com/" } };
QNetworkReply*reply=\u manager.get(请求);
QString*data=新的QString{“测试数据!”};
_存储[应答]=数据;
连接(&_管理器,&QNetworkAccessManager::已完成,
[此](QNetworkReply*回复)
{
如果(回复->错误())
{
qWarning()追加(“追加的数据!”);


qDebug()什么是数据存储。删除(回复)
do--it
delete
回复吗?调试器怎么说调用堆栈处于崩溃点?@G.M.我在stackoverflow上发现了同样的问题,我的计划也采用了同样的方式,但我的应用程序崩溃了。你在哪里阅读
reply
中的
response
?你正在试图存储一个l的引用局部变量(
数据
)进入
QHash
,调用
reply_finished
时,它是
从散列中删除
d。我不确定这是否是您最初想要的。您应该读取
finished
信号上的响应,然后使用它。@Azeem我的意思是,当网络完成信号发出时,我可以将一个值传递到插槽,并可以得到t他通过处理值并从插槽返回。你能理解我吗?我希望得到你的帮助。谢谢。问题我认为是指针。确保你的指针不是空的。最好使用QHash,因为QString内部使用隐式shareWhat does
data_storage。移除(回复)
do--it
delete
回复吗?调试器怎么说调用堆栈处于崩溃点?@G.M.我在stackoverflow上发现了同样的问题,我的计划也采用了同样的方式,但我的应用程序崩溃了。你在哪里阅读
reply
中的
response
?你正在试图存储一个l的引用局部变量(
数据
)进入
QHash
,调用
reply_finished
时,它是
从散列中删除
d。我不确定这是否是您最初想要的。您应该读取
finished
信号上的响应,然后使用它。@Azeem我的意思是,当网络完成信号发出时,我可以将一个值传递到插槽,并可以得到t他通过处理值并从插槽返回。你能理解我吗?我希望得到你的帮助。谢谢。问题我认为是指针。确保你的指针不是空的。最好使用QHash,因为QString内部使用隐式共享谢谢你的帮助,我试着用你的方式,我想我在网络结束后无法获得反馈,它可以传递值(数据),但不能返回值(数据)对它调用函数。你能理解并帮助我吗?我的英语不好,我可能无法清楚地告诉你我的问题,请不要介意。@xiazhanjian:Your
data
是一个局部变量。在heap上创建它,然后就可以使用你的方式了。谢谢你的帮助!@xiazhanjian:不客气!你解决了你的问题吗?不,我发现当我试图传递数据并获取反馈时,我的应用程序也崩溃了。我仍然会重试…如果我仍然有相同的问题,我想我会寻求你的帮助。感谢你的帮助,我尝试使用你的方式,我想当n