Qt C++应用启动即上传Firebase数据,如何修改为点击提交按钮后上传并关闭
问题原因
你的程序启动就上传全0数据是两个逻辑错误导致的:
main.cpp中应用启动时就直接实例化了DatabaseHandler,而你把Firebase上传逻辑全写在了DatabaseHandler的构造函数中,此时用户还未进行任何输入,happy、hungry等存储用户输入的变量都是初始默认值0,所以会直接上传全0条目。- 提交按钮的点击回调
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
相关产品推荐
相关产品推荐

