Qt_Creator 关闭 gui 和 运行 main.cpp

Qt_Creator close gui and run main.cpp

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

这是我的 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();
}

应用卡在 w.show()。我怎样才能使提交按钮结束 w.show() 和 运行 下一行 DatabaseHandler dbhandler

这是我的 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();
}

好吧,我想你有点困惑。 w.show() 使 window 出现。而已。执行一直持续到 a.exec().

您需要做的是让您的 window 告诉您的 DatabaseHandler 何时需要获取值并进行更新。 Qt的方式是设置一个信号。我发现这些有点痛苦,所以我使用依赖注入。也就是说,我会在 main 中更早地创建处理程序,但不会让构造函数完成所有这些工作。做一个方法。然后在 window.

的构造函数中传递对处理程序的引用

然后当按钮被点击时,调用处理程序的方法来完成它的工作。之后,您可以根据需要关闭该应用程序。