应用程序在将数据上传到数据库之前关闭,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
};
所以我做了一个基本的应用程序,允许用户输入数据,然后在按下提交时将数据提交到 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
};