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

【Qt】数据库管理

数据库查询工具开发学习笔记

一、项目背景与目标

背景:频繁编写数据库查询语句,希望通过工具简化操作,提升效率。

二、总体设计思路
1. 架构设计

MVC模式:通过Qt控件实现视图(UI),业务逻辑(数据库操作、查询处理)封装在dataQueryImpl类中,使用QSqlQueryModel作为数据模型显示查询结果。模块化设计:分离数据库连接管理、UI初始化、查询逻辑、历史记录等功能,便于维护和扩展。

2. 核心功能模块
  • 数据库连接管理:支持动态切换数据库路径,处理连接创建、关闭、错误处理。
  • 可视化UI:通过QSplitter分隔左右区域,左侧显示表和列结构,右侧输入查询条件并展示结果。
  • 查询功能:支持自由SQL输入和可视化条件拼接(通过列选择、运算符下拉框、值输入)。
  • 查询历史:记录最近50条查询语句,便于快速复用。
    在这里插入图片描述
三、核心代码解析
1. 数据库连接与切换(核心逻辑)
void dataQueryImpl::setDB(const QString& dbPath) {
    // 1. 关闭旧连接
    if (db.isOpen()) db.close();
    // 2. 移除旧默认连接(避免重复)
    QSqlDatabase::removeDatabase("");
    // 3. 创建新连接
    db = QSqlDatabase::addDatabase("QSQLITE", "");
    db.setDatabaseName(dbPath);
    // 4. 打开数据库并处理错误
    if (!db.open()) {
        qCritical() << "数据库打开失败:" << db.lastError().text();
    } else {
        qDebug() << "数据库路径已更新为:" << dbPath;
        updateUI(); // 刷新表列表
    }
}
  • 设计要点:显式管理数据库连接,避免内存泄漏;切换数据库后自动刷新表列表(updateUI)。
3. 查询逻辑与结果展示
QSqlQueryModel* dataQueryImpl::queryData(const QString& query) {
    QSqlQueryModel* newModel = new QSqlQueryModel();
    newModel->setQuery(query, db); // 指定数据库连接
    if (newModel->lastError().isValid()) {
        qDebug() << "Query error:" << newModel->lastError().text();
    }
    appendQueryHistory(query); // 记录查询历史
    return newModel;
}

void dataQueryImpl::onExecuteQueryButtonClicked() {
    QString query = queryInput->text();
    QSqlQueryModel* newModel = queryData(query);
    tableView->setModel(newModel);
    // 释放旧模型内存
    if (model != newModel) delete model;
    model = newModel;
}
  • 关键逻辑:使用QSqlQueryModel直接绑定数据库查询结果到表格;查询前记录历史,支持最多50条记录的循环存储。
4. 条件查询与可视化拼接
void dataQueryImpl::onAddConditionButtonClicked() {
    QString column = columnListView->currentIndex().data().toString();
    QString sqlOp = conditionOperatorComboBox->currentData().toString();
    QString value = valueInput->text().trimmed();
    
    // 格式化值(处理引号、LIKE通配符等)
    QString formattedValue = valueFormatters[sqlOp].arg(value);
    QString condition = column + " " + sqlOp + " " + formattedValue;
    
    // 拼接多个条件(使用AND连接)
    conditionsInput->setText(conditionsInput->text().isEmpty() ? 
                             condition : conditionsInput->text() + " AND " + condition);
}

QSqlQueryModel* dataQueryImpl::queryDataByConditions(const QString& tableName, const QMap<QString, QString>& conditions) {
    QString query = "SELECT * FROM " + tableName;
    if (!conditions.isEmpty()) {
        query += " WHERE " + conditions.keys().join(" = :") + " = :"; // 简化条件拼接
    }
    return queryData(query);
}
onditions.keys().join(" = :") + " = :"; // 简化条件拼接
    }
    return queryData(query);
}

gitee项目地址

http://www.dtcms.com/a/99230.html

相关文章:

  • Unity编辑器功能及拓展(3) —[Attribute]特性
  • 导航到渲染:浏览器加载页面的关键路径分析
  • 链表的创建:头插法与尾插法详解(数据结构)
  • 指纹识别之whois的作用:WHOIS数据在渗透测试中深度利用
  • vmware 创建win10 系统,虚拟机NAT网络设置
  • OJ题:移动零
  • Day 5
  • FPGA实现4K MIPI视频解码转HDMI2.0输出,基于IMX317摄像头,支持4K@60Hz,提供2套工程源码和技术支持
  • Logback 全面指南:从基础配置到高级应用
  • 76个复古黑白科幻几何抽象灵感运动元素纹理DJ舞台背景MV视频/PSD/PNG/JPG素材 Pixflow - Tour Visual Elements
  • 深入实践:基于WebSocket的全球化金融数据实时对接方案。 马来西亚、印度、美国金融数据API
  • 【Python桌面应用】PySide6 界面开发完全指南
  • javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。
  • 1014 Waiting in Line
  • C++中shared_ptr 是线程安全的吗?
  • 使用 Avada 主题实现高级表单功能的技术指南
  • Day2 蓝桥杯省赛冲刺精炼刷题 —— 递归与递推
  • 浙江大学公开课|第二季|从大模型、智能体到复杂AI应用系统的构建——以产业大脑为例
  • final+模版设计模式的理解
  • [操作系统,学习记录]3.进程(2)
  • -PHP 应用文件上传函数缺陷条件竞争二次渲染黑白名单JS 绕过
  • AI大模型从0到1记录学习 day09
  • 求解AX=XB 方法
  • 车载软件刷写 --- 由擦除例程问题带来的反思
  • Java 图片压缩:高效压缩方案解析
  • 基于三维数字图像相关(DIC)技术的生物材料多尺度力学性能原位表征方法研究
  • 基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
  • Centos安装Python3.7(亲测可用)
  • github——SSH连接配置文档
  • @Slf4j注解