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

Qt应用未完成Firebase数据上传就提前关闭问题如何解决?

问题根源

QNetworkAccessManager的网络请求是异步执行的,调用post()方法只是把请求加入执行队列,不会阻塞等待请求完成再返回。你原代码在post()执行完立刻调用exit(),应用进程直接终止,未完成的网络请求被强行中断,自然无法写入Firebase。

现有代码的已知问题

  1. 提交按钮逻辑错误:按钮点击事件中同时调用post()和exit(),完全没有等待网络请求返回结果
  2. 槽函数签名不匹配:你已经连接了finished(QNetworkReply*)信号,但定义的无参myOnFinishSlot()不会被触发,带参的myOnFinishSlot(QNetworkReply* x)没有实现对应的退出逻辑
  3. 低级拼写错误:请求URL写为User.jason,Firebase实时数据库的正确后缀是.json,拼写错误会直接导致请求失败

修复方案

1. 修改提交按钮点击逻辑

移除直接调用的exit(),仅保留post()触发上传:

void checkinapp::on_pushButton_clicked()
{
    checkinapp::post();
}

2. 实现匹配的槽函数逻辑

在网络请求完成的回调中再执行退出操作,可新增错误判断避免上传失败也退出的问题:

void checkinapp::myOnFinishSlot(QNetworkReply* reply)
{
    if (reply->error() == QNetworkReply::NoError) {
        // 上传成功后再退出应用
        exit();
    } else {
        // 此处可新增上传失败的提示逻辑,比如弹框告知用户错误原因
    }
    reply->deleteLater(); // 释放reply对象避免内存泄漏
}

删除你代码中无用的无参myOnFinishSlot()即可。

3. 修正URL拼写错误

将post()方法中的URL拼写修正:

// 错误写法
// QNetworkRequest newUserRequest( QUrl( "url/User.jason"));
// 正确写法
QNetworkRequest newUserRequest( QUrl( "url/User.json"));

可选优化

  • 点击提交后将按钮置灰,避免用户重复点击触发多次上传
  • 上传过程中增加加载提示,避免用户误以为应用卡顿强行终止进程

内容的提问来源于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:54:00