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

Qt Creator项目点击提交按钮关闭GUI执行DatabaseHandler代码问题问询

问题根源

你现在的代码逻辑存在两处核心错误:

  1. w.show()不会阻塞运行,它只是触发窗口绘制的非阻塞方法,你感知到的"卡住"是后续a.exec()启动了Qt全局事件循环导致的,你的代码会在窗口显示的同时立刻执行DatabaseHandler dbhandler,此时用户还没有完成输入,所有存储输入值的全局变量都是初始状态,完全不符合需求。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:54:02