Qt应用未完成Firebase数据上传就提前关闭问题如何解决?
问题根源
QNetworkAccessManager的网络请求是异步执行的,调用post()方法只是把请求加入执行队列,不会阻塞等待请求完成再返回。你原代码在post()执行完立刻调用exit(),应用进程直接终止,未完成的网络请求被强行中断,自然无法写入Firebase。
现有代码的已知问题
- 提交按钮逻辑错误:按钮点击事件中同时调用
post()和exit(),完全没有等待网络请求返回结果 - 槽函数签名不匹配:你已经连接了
finished(QNetworkReply*)信号,但定义的无参myOnFinishSlot()不会被触发,带参的myOnFinishSlot(QNetworkReply* x)没有实现对应的退出逻辑 - 低级拼写错误:请求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
相关产品推荐
相关产品推荐

