Qt Creator项目点击提交按钮关闭GUI执行DatabaseHandler代码问题问询
问题根源
你现在的代码逻辑存在两处核心错误:
w.show()不会阻塞运行,它只是触发窗口绘制的非阻塞方法,你感知到的"卡住"是后续a.exec()启动了Qt全局事件循环导致的,你的代码会在窗口显示的同时立刻执行DatabaseHandler dbhandler,此时用户还没有完成输入,所有存储输入值的全局变量都是初始状态,完全不符合需求。- DatabaseHandler的构造函数中,你没有将网络请求管理器的
finished信号绑定到networkReplyReadyRead槽,请求返回后你无法拿到响应结果。
以下提供两种适配方案,可按需选择:
方案1:最小改动适配原有需求(提交后再执行数据库初始化)
这个方案完全符合你"点击提交后再执行下一行DatabaseHandler代码"的要求,改动量最小:
步骤1:修改checkinapp的父类为QDialog
编辑checkinapp.h,将类继承关系从QMainWindow改为QDialog:
// 修改前 class checkinapp : public QMainWindow // 修改后 class checkinapp : public QDialog
同步修改checkinapp.cpp的构造函数父类引用:
// 修改前 checkinapp::checkinapp(QWidget *parent) : QMainWindow(parent), ui(new Ui::checkinapp) // 修改后 checkinapp::checkinapp(QWidget *parent) : QDialog(parent), ui(new Ui::checkinapp)
步骤2:修改提交按钮的点击槽函数
编辑checkinapp.cpp的on_pushButton_clicked方法,用户点击提交后关闭对话框并返回确认状态:
void checkinapp::on_pushButton_clicked() { submitted = true; cout << submitted; accept(); // 新增这行,关闭对话框并返回Accepted状态 }
步骤3:修改main.cpp的执行逻辑
将w.show()改为阻塞的w.exec(),只有用户点击提交后才会执行后续的数据库初始化逻辑:
#include "checkinapp.h" #include "databasehandler.h" #include <QApplication> #include <QDialog> int main(int argc, char *argv[]) { QApplication a(argc, argv); checkinapp w; // exec()会阻塞直到对话框关闭,用户提交后才会执行下一行 if (w.exec() == QDialog::Accepted) { DatabaseHandler dbhandler; } // 不需要再启动事件循环,上传完成后程序直接退出 return 0; }
方案2:更合理的Qt式逻辑(提交后直接触发上传)
如果你不需要严格保持原有代码的执行顺序,推荐用这种更符合Qt事件驱动逻辑的方案,不需要修改父类:
步骤1:给checkinapp增加DatabaseHandler成员
编辑checkinapp.h,在private区域添加成员指针:
private: Ui::checkinapp *ui; DatabaseHandler *m_dbHandler; // 新增这行
步骤2:修改提交按钮槽函数触发上传
编辑checkinapp.cpp的on_pushButton_clicked方法:
void checkinapp::on_pushButton_clicked() { submitted = true; cout << submitted; // 直接创建数据库处理实例触发上传 m_dbHandler = new DatabaseHandler(this); // 可选:提交后关闭窗口 close(); }
步骤3:清理main.cpp冗余代码
删除main.cpp中多余的DatabaseHandler初始化代码:
int main(int argc, char *argv[]) { QApplication a(argc, argv); checkinapp w; w.show(); return a.exec(); }
通用修复项
两种方案都需要修复DatabaseHandler的信号绑定问题,编辑databasehandler.cpp的构造函数,添加信号槽绑定:
DatabaseHandler::DatabaseHandler(QObject *parent) : QObject(parent) { m_networkManager = new QNetworkAccessManager ( this ); // 新增这行,绑定网络请求完成信号到响应处理槽 connect(m_networkManager, &QNetworkAccessManager::finished, this, &DatabaseHandler::networkReplyReadyRead); // 原有上传逻辑不变 QVariantMap newUser; // ... 其余原有代码保持不变 }
内容的提问来源于stack exchange,提问作者SilverSerpent03
相关产品推荐
相关产品推荐

