You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt C++应用启动即上传Firebase数据,如何修改为点击提交按钮后上传并关闭

问题原因

你的程序启动就上传全0数据是两个逻辑错误导致的:

  1. main.cpp 中应用启动时就直接实例化了DatabaseHandler,而你把Firebase上传逻辑全写在了DatabaseHandler的构造函数中,此时用户还未进行任何输入,happy、hungry等存储用户输入的变量都是初始默认值0,所以会直接上传全0条目。
  2. 提交按钮的点击回调on_pushButton_clicked目前仅修改了submitted标记,没有关联上传逻辑,也没有执行关闭应用的操作。

修改方案

1. 重构DatabaseHandler,剥离上传逻辑

把上传逻辑从构造函数中移到独立的公共方法中,避免实例化就自动上传:

  • 修改databasehandler.h,新增公共方法声明:
#ifndef DATABASEHANDLER_H
#define DATABASEHANDLER_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class DatabaseHandler : public QObject
{
    Q_OBJECT
public:
    explicit DatabaseHandler(QObject *parent = nullptr);
    ~DatabaseHandler();
    // 新增上传数据的独立方法
    void uploadData();

public slots:
    void networkReplyReadyRead();

signals:

private:
    QNetworkAccessManager * m_networkManager;
    QNetworkReply * m_networkReply;

};
#endif // DATABASEHANDLER_H
  • 修改databasehandler.cpp,调整逻辑位置:
#include "databasehandler.h"
#include "global_objects.hpp"
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QVariantMap>

DatabaseHandler::DatabaseHandler(QObject *parent) : QObject(parent)
{
    // 构造函数只做网络管理器初始化,不执行上传
    m_networkManager = new QNetworkAccessManager ( this );
}

// 上传逻辑移到这个独立方法里
void DatabaseHandler::uploadData()
{
    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 );
    // 这里把"url/User.json"替换成你自己的Firebase数据库地址
    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();
}

2. 调整DatabaseHandler的实例化位置,不要在启动时创建

  • 先修改main.cpp,删掉提前实例化DatabaseHandler的代码:
#include "checkinapp.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    checkinapp w;
    w.show();
    // 删掉原来的DatabaseHandler dbhandler;这一行
    return a.exec();
}
  • 修改checkinapp.h,把DatabaseHandler作为类的私有成员:
// 前面的include部分保持不变,新增DatabaseHandler的头文件引用
#include "databasehandler.h"

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;
    // 新增DatabaseHandler成员
    DatabaseHandler *m_dbHandler;
};
  • 修改checkinapp.cpp的构造函数,初始化DatabaseHandler:
checkinapp::checkinapp(QWidget *parent)
    : QMainWindow(parent),
    ui(new Ui::checkinapp)
{
    ui->setupUi(this);
    // 初始化数据库处理实例
    m_dbHandler = new DatabaseHandler(this);
}

3. 修改提交按钮的点击逻辑,触发上传并关闭应用

修改checkinapp.cpp里的on_pushButton_clicked方法:

void checkinapp::on_pushButton_clicked()
{
    submitted = true;
    // 调用上传方法
    m_dbHandler->uploadData();
    // 关闭窗口,应用自动退出
    this->close();
}

额外优化建议

尽量不要用全局变量存储用户输入的状态,可以把happy、hungry、gender这些变量都封装到checkinapp类的私有成员里,避免全局变量污染带来的异常问题。

内容的提问来源于stack exchange,提问作者SilverSerpent03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:09:03