当前位置: 首页 > ds >正文

qt项目中解决关闭弹窗后执行主界面的信号槽时闪退问题

问题描述

在主界面打开一个弹窗

// 连接点击事件connect(addButton, &QToolButton::clicked, this, [=]() {qDebug() << "点击了添加按钮";if(this->tablename=="projects"){// 使用堆分配并指定父对象auto *dialog = new projectadddialog(this);// 确保对话框关闭时自动删除dialog->setAttribute(Qt::WA_DeleteOnClose);// 连接对话框关闭信号到表格刷新connect(dialog, &projectadddialog::accepted, this, [=]() {model->select(); // 刷新表格数据});// 非阻塞方式显示dialog->open();}});

然后关闭弹窗后,执行到主界面此处信号槽时:

 connect(sidebar, &QListWidget::currentItemChanged, [this](QListWidgetItem *current) {// 添加对话框存在检查if (findChild<projectadddialog*>()) {qDebug() << "对话框打开中,忽略导航切换";return;}try {// 1. 快速校验空指针if (!current) {qDebug() << "当前选中项为空,忽略操作";return;}// const QVariant pageData ;// 2. 提取并校验页面标识数据(可能抛出转换异常)// 添加widget有效性检查if (!this || !sidebar || !current) {qDebug() << "对象已失效";return;}// 检查item是否仍存在于listWidget中if (sidebar->row(current) < 0) {qDebug() << "该项已被移除";return;}// 加强有效性检查if (!current || !sidebar->item(sidebar->row(current))) {qDebug() << "当前选中项无效";return;}// 检查数据是否存在if (!current->data(Qt::UserRole).isValid()) {qDebug() << "UserRole 数据无效";return;}const QVariant pageData = current->data(Qt::UserRole);if (!pageData.canConvert<QString>()) {throw std::invalid_argument("页面标识数据类型错误,预期字符串类型");}const QString pageName = pageData.toString().trimmed();if (pageName.isEmpty()) {throw std::invalid_argument("页面标识为空,无法处理");}qDebug() << "切换到页面:" << pageName;// 3. 校验projectPage有效性if (!projectPage) {throw std::runtime_error("projectPage未初始化,无法重置模型");}// 4. 查表映射表名并重置模型static const QHash<QString, QString> pageTableMap = {{"项目管理", "projects"},{"机构管理", "organizations"}};const QString tableName = pageTableMap.value(pageName);if (tableName.isEmpty()) {throw std::out_of_range("未找到页面对应的表名映射: " + pageName.toStdString());}projectPage->resetModel(tableName);qDebug() << "当前表名:" << projectPage->tablename;} catch (const std::exception &e) {// 捕获标准库异常(如invalid_argument、runtime_error等)qCritical() << "处理页面切换时出错: " << e.what();} catch (...) {// 捕获所有其他未明确声明的异常qCritical() << "处理页面切换时发生未知错误";}});

在执行到这行代码时闪退了:

const QVariant pageData = current->data(Qt::UserRole);
解决方法

在弹窗类的构造函数中重复拿取了数据库:

projectadddialog::projectadddialog(QWidget *parent): QDialog(parent), ui(new Ui::projectadddialog)
{ui->setupUi(this);m_db = QSqlDatabase::addDatabase("QSQLITE");m_db.setDatabaseName("ProjectManagementSystem.db");// 使用主窗口的数据库连接,而不是新建连接//m_db = QSqlDatabase::database(); // 获取默认连接setWindowTitle(tr("添加新项目"));setMinimumWidth(500);initUI();loadForeignKeyData();connect(m_confirmBtn, &QPushButton::clicked, this, &projectadddialog::onConfirmClicked);connect(m_cancelBtn, &QPushButton::clicked, this, &projectadddialog::onCancelClicked);
}

这行代码重复拿取了:

m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("ProjectManagementSystem.db");

改为:

m_db = QSqlDatabase::database(); // 获取默认连接

直接获取主界面的数据库连接就可以了

http://www.xdnf.cn/news/18007.html

相关文章:

  • MySql——聚簇索引(主键索引)和非聚簇索索引(非主键索引)引区别(即聚集索引和非聚集索引区别)
  • Java 学习笔记(基础篇2)
  • Docker build创建镜像命令入门教程
  • **超融合架构中的发散创新:探索现代编程语言的挑战与机遇**一、引言随着数字化时代的快速发展,超融合架构已成为IT领域的一种重要趋势
  • ts概念讲解
  • Vue 3 + TypeScript:package.json 示例 / 详细注释说明
  • 基于Java飞算AI的Spring Boot聊天室系统全流程实战
  • 快速部署一个鉴黄服务
  • 前端vue框架
  • 【机器人-开发工具】ROS 2 (4)Jetson Nano 系统Ubuntu22.04安装ROS 2 Humble版本
  • 【Java 后端】Spring Boot 集成 JPA 全攻略
  • Nginx学习笔记(九)—— Nginx Rewrite深度解析
  • 版本更新!FairGuard-Mac加固工具已上线!
  • win11右键菜单改回win10样式
  • Data Augmentation数据增强
  • EtherCAT概念介绍
  • EchoEar喵伴接入小聆AI,MCP服务轻松体验,智能升级!
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • 如何基于langchain基类LLM自定义大模型
  • 飞算JavaAI开发全流程解析:从自然语言到可运行工程的智能进化
  • 从零开始学Python之数据结构(字符串以及数字)
  • 深入解析 Chrome UI 布局配置的设计思想与实现机制
  • STL算法【常用的算数生成算法】
  • vue3+leaflet案例:告警系统GIS一张图(附源码下载)
  • 基于大语言模型的爬虫数据清洗与结构化
  • 手机实时提取SIM卡打电话的信令声音-整体解决方案规划
  • 《WebGL中FBO的底层运行逻辑》
  • Day57--图论--53. 寻宝(卡码网)
  • 【前端工具】使用 Node.js 脚本实现项目打包后自动压缩
  • 计算机视觉(opencv)实战三——图像运算、cv2.add()、cv2.addWeighted()