告诉函数等待,直到用户按下带有 Qt 的按钮

Tell a function to wait until the user presses a button with Qt

我创建了一个项目和一个基本应用程序,其中有一个 ui 弹出供用户输入数据,然后将数据上传到 firebase 数据库。当我尝试 运行 应用程序时, ui 出现,我可以输入如下图所示的数据:

但是,应用程序在运行后立即上传到数据库,因此数据库条目全为零。如何使应用程序上传到数据库并在按提交后关闭。我是 c++ 的新手,所以任何帮助将不胜感激:)。

这是我的 main.cpp:

#include "checkinapp.h"
#include "databasehandler.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    checkinapp w;
    w.show();
    DatabaseHandler dbhandler;
    return a.exec();
}

这是我的 checkinapp.h:

#ifndef CHECKINAPP_H
#define CHECKINAPP_H

#include <iostream>

#include <QMainWindow>
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QMessageBox>
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>


QT_BEGIN_NAMESPACE
namespace Ui { class checkinapp; }
QT_END_NAMESPACE

class checkinapp : public QMainWindow
{
    Q_OBJECT

public:
    checkinapp(QWidget *parent = nullptr);
    ~checkinapp();

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;
};


#endif  // CHECKINAPP_H

checkinapp.cpp:

#include "checkinapp.h"
#include "ui_checkinapp.h"
#include "databasehandler.h"
#include "global_objects.hpp"
#include <QNetworkRequest>
#include <QDebug>
#include <QJsonDocument>
#include <QVariantMap>
#include <iostream>

using namespace std;

checkinapp::checkinapp(QWidget *parent)
    : QMainWindow(parent),
    ui(new Ui::checkinapp)
{
    ui->setupUi(this);
}
checkinapp::~checkinapp()
{
    if(help == 1)
    {
        //delete ui;
    }
    if(help == 1)
    {
        cout << "help";
    }
}

void checkinapp::on_happy_valueChanged(int value)
{
    happy = value;
}

void checkinapp::on_hungry_valueChanged(int value)
{
    hungry = value;
}


void checkinapp::on_sleep_valueChanged(int value)
{
    tired = value;
}


void checkinapp::on_stress_valueChanged(int value)
{
    stressed = value;
}


void checkinapp::on_male_toggled(bool checked)
{
    if(checked == true)
    {
        gender = 0;
    }
}

void checkinapp::on_female_toggled(bool checked)
{
    if(checked == true)
    {
        gender = 1;
    }
}

void checkinapp::on_other_toggled(bool checked)
{
    if(checked == true)
    {
        gender = 2;
    }
}

void checkinapp::on_help_toggled(bool checked)
{
    if(checked == true)
    {
        help = 1;
    }
}

void checkinapp::on_pushButton_clicked()
{
    submitted = true;
        if(submitted==true)
        {
            cout <<submitted;
        }
    //delete ui;
}

databasehandler.h:

#ifndef DATABASEHANDLER_H
#define DATABASEHANDLER_H
#include <checkinapp.h>
#include <QObject>
#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class DatabaseHandler : public QObject
{
    Q_OBJECT
public:
    explicit DatabaseHandler(QObject *parent = nullptr);
    ~DatabaseHandler();

public slots:
    void networkReplyReadyRead();


signals:

private:
    QNetworkAccessManager * m_networkManager;
    QNetworkReply * m_networkReply;

};

#endif // DATABASEHANDLER_H

databasehandler.cpp:

#include "checkinapp.h"
#include "databasehandler.h"
#include "global_objects.hpp"
#include <QNetworkRequest>
#include <QDebug>
#include <QJsonDocument>
#include <QVariantMap>
#include <iostream>


DatabaseHandler::DatabaseHandler(QObject *parent) : QObject(parent)
{
    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.json"));
    newUserRequest.setHeader( QNetworkRequest::ContentTypeHeader, QString( "application/json" ));
    m_networkManager->post( newUserRequest, jsonDoc.toJson() );
}
DatabaseHandler::~DatabaseHandler()
{
    m_networkManager->deleteLater();
}
void DatabaseHandler::networkReplyReadyRead()
{
    //qDebug() << m_networkReply->readAll();
}

为此,根据您的代码,您不应该在 main() 函数中处理数据库连接,而是在特定的管理器中根据您的需要打开或关闭。

所以按照你的代码,你在这里有一些想法:

  • main() 中删除 DatabaseHandler dbhandler; 并在 checkinapp class 中创建它,使用值集将新方法添加到数据库中的 post 值在 GUI 中。
  • 保留行 DatabaseHandler dbhandler; 但随后您需要将对象传递给 checkinapp class。与以前一样,您将需要新的方法来填充数据库。

除此之外,我认为您不需要 post 在 DatabaseHandler 构造函数的开头:

m_networkManager->post( newUserRequest, jsonDoc.toJson() );