应用程序在将数据上传到数据库之前关闭,Qt

App closes before uploading data to database, Qt

所以我做了一个基本的应用程序,允许用户输入数据,然后在按下提交时将数据提交到 firebase,然后应用程序关闭。但是由于某种原因,应用程序在未向 firebase 提交数据的情况下关闭。

提交按钮代码如下:

void checkinapp::on_pushButton_clicked()
{
    checkinapp::post();
    checkinapp::exit();
}

post()exit()定义如下:

void post()
    {
        m_networkManager = new QNetworkAccessManager ( this );
        QVariantMap newUser;
        newUser[ "Stress" ] = QString::number(stressed);
        newUser[ "Sleep" ] = QString::number(tired);
        newUser[ "Hungry" ] = QString::number(hungry);
        newUser[ "Happy" ] = QString::number(happy);
        newUser[ "Grade" ] = QString::number(grade);
        newUser[ "Date" ] = "1/10/21";
        newUser[ "Gender" ] = QString::number(gender);
        newUser[ "Aid" ] = QString::number(help);
        QJsonDocument jsonDoc = QJsonDocument::fromVariant( newUser );
        QNetworkRequest newUserRequest(Url( "url/User.json"));
        newUserRequest.setHeader( QNetworkRequest::ContentTypeHeader, QString( "application/json" ));
        m_networkManager->post( newUserRequest, jsonDoc.toJson() );
        submitted = true;
    }

void exit()
    {
        if(submitted==true)
        {
            QApplication::exit();
        }

    }

当我注释掉 checkinapp::exit() 时,应用程序会提交到数据库但不会关闭。然而,当它没有被注释掉时,它会关闭应用程序而不上传到数据库。

编辑:这是我的 class:

class checkinapp : public QMainWindow
{
    Q_OBJECT

public:
    checkinapp(QWidget *parent = nullptr);
    ~checkinapp();
    void databasehandler(QWidget *parent = nullptr);
    int stressed;
    int happy;
    int hungry;
    int tired;
    int gender;
    bool help;
    int grade;
    bool submitted;
    //bool QNetworkReply::isFinished() const;
    void post()
    {
        m_networkManager = new QNetworkAccessManager ( this );
        QVariantMap newUser;
        newUser[ "Stress" ] = QString::number(stressed);
        newUser[ "Sleep" ] = QString::number(tired);
        newUser[ "Hungry" ] = QString::number(hungry);
        newUser[ "Happy" ] = QString::number(happy);
        newUser[ "Grade" ] = QString::number(grade);
        newUser[ "Date" ] = "1/10/21";
        newUser[ "Gender" ] = QString::number(gender);
        newUser[ "Aid" ] = QString::number(help);
        QJsonDocument jsonDoc = QJsonDocument::fromVariant( newUser );
        QNetworkRequest newUserRequest( QUrl( "url/User.jason"));
        newUserRequest.setHeader( QNetworkRequest::ContentTypeHeader, QString( "application/json" ));

        connect(m_networkManager, SIGNAL(finished(QNetworkReply*)),
        this,SLOT(myOnFinishSlot(QNetworkReply*)));

        m_networkManager->post( newUserRequest, jsonDoc.toJson() );
        //submitted = true;
    }
    void myOnFinishSlot()
    {
        exit();
    }
    void exit()
    {
        QApplication::quit();
    }

public slots:
    //void networkReplyReadyRead();
    void myOnFinishSlot(QNetworkReply* x);
private slots:

    void on_happy_valueChanged(int value);

    void on_hungry_valueChanged(int value);

    void on_sleep_valueChanged(int value);

    void on_stress_valueChanged(int value);

    void on_male_toggled(bool checked);

    void on_female_toggled(bool checked);

    void on_other_toggled(bool checked);

    void on_help_toggled(bool checked);

    void on_pushButton_clicked();

private:
    Ui::checkinapp *ui;
    QNetworkAccessManager * m_networkManager;
    QNetworkReply * m_networkReply;
};

如果我是你,我会这样做:

void checkinapp::on_pushButton_clicked()
{
    checkinapp::post();
    //checkinapp::exit();
}

然后在post方法中:

void post()
{
    m_networkManager = new QNetworkAccessManager ( this );
    ...
    HERE connect the Manager to your custom slot, something like
    connect(mm_networkManager, SIGNAL(finished(QNetworkReply*)),
    this,SLOT(myOnFinishSlot(QNetworkReply*)));
    m_networkManager->post( newUserRequest, jsonDoc.toJson() );
    //submitted = true;
}

然后在收到响应后通过调用 exit:

关闭所有
void myOnFinishSlot(QNetworkReply* x)
{
    ....
    do some stuff
    exit();
}

如何定义插槽:

checkinapp的头文件中做

class checkinapp : public QObject
{
    Q_OBJECT

public:
    //your public data

public slots:
    void myOnFinishSlot(QNetworkReply* x);

signals:
    //your signals if any

private:
    //your private data
};