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

QT--SQLite

配置类相关的表,所以我使用sqlite,且QT自带该组件;

1.安装 sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575
使用SQLiteExpert建好数据库.db文件,和对应的表后把db文件放在指定目录 ./db/program.db;

2.选择sql组件

在这里插入图片描述
3.新增数据库处理类,在使用数据库的地方调用类成员函数即可

DataModel::DataModel()
{db = QSqlDatabase::addDatabase("QSQLITE", "");db.setDatabaseName("./db/program.db");connectDataBase();
}DataModel::~DataModel()
{disconnectDataBase();
}// 打开数据库文件
bool DataModel::connectDataBase() {bool ret = db.open();if (!ret) {outPutMsg(QtDebugMsg, "DataModel::connectDataBase error = " + db.lastError().text());} return ret;
}
// 关闭数据库文件
void DataModel::disconnectDataBase() {db.close();
}
QStringList DataModel::queryProgramList() {QStringList programList;// 根据名字查询QString sql = QString("select sectionBarName,programNo from program where 1=1;");outPutMsg(QtDebugMsg, "DataModel::queryProgramList sql = " + sql);// 创建一个可以对db执行语句的对象QSqlQuery query(db);// 执行sql语句bool ret = query.exec(sql);if (!ret){outPutMsg(QtDebugMsg, "DataModel::queryProgramNo error = " + query.lastError().text());return programList;}// 行坐标向下移while (query.next()){//获取数据库query所指的那行的数据QString program;program += (query.value(0).toString() + ";"); // sectionBarNameprogram += QString::number(query.value(1).toInt()); // programNo// outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode programInfo = " + program);programList.append(program);}return programList;
}
// 根据型材代号查询程序号码
QString DataModel::queryProgramNo(QString sectionBarNo) {// 根据名字查询QString sql = QString("select programNo from program where sectionBarName=\'%1\';").arg(sectionBarNo);//QString sql = QString("select programNo from program where 1=1");outPutMsg(QtDebugMsg, "DataModel::queryProgramNo sql = " + sql);// 创建一个可以对db执行语句的对象QSqlQuery query(db);// 执行sql语句bool ret = query.exec(sql);if (!ret){outPutMsg(QtDebugMsg, "DataModel::queryProgramNo error = " + query.lastError().text());return "";}QString programNo = "";// 行坐标向下移while (query.next()){//获取数据库query所指的那行的数据programNo = QString::number(query.value(0).toInt());outPutMsg(QtDebugMsg, "DataModel::queryProgramNo programNo = " + programNo);}return programNo;
}// 根据程序号码查询
QString DataModel::queryProgramByNo(QString programNo) {// 根据名字查询QString sql = QString("select sectionBarName from program where programNo=\'%1\';").arg(programNo);//QString sql = QString("select programNo from program where 1=1");outPutMsg(QtDebugMsg, "DataModel::queryProgramByNo sql = " + sql);// 创建一个可以对db执行语句的对象QSqlQuery query(db);// 执行sql语句bool ret = query.exec(sql);if (!ret){outPutMsg(QtDebugMsg, "DataModel::queryProgramByNo error = " + query.lastError().text());return "";}QString sectionBarNo = "";// 行坐标向下移while (query.next()){//获取数据库query所指的那行的数据sectionBarNo = QString::number(query.value(0).toInt());outPutMsg(QtDebugMsg, "DataModel::queryProgramByNo sectionBarNo = " + sectionBarNo);}return sectionBarNo;
}// 根据型材代号查询程序号码
QStringList DataModel::queryProgramInfoBySectionCode(QString sectionBarNo) {QStringList programInfoList;// 根据名字查询// 使用索引sectionBarNameQString sql = QString("select stepNo, cutNo,x, y, f, Rx, Ry from programInfo where programNo = (select programNo from program where sectionBarName=\'%1\');").arg(sectionBarNo);//QString sql = QString("select programNo from program where 1=1");outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode sql = " + sql);// 创建一个可以对db执行语句的对象QSqlQuery query(db);// 执行sql语句bool ret = query.exec(sql);if (!ret){outPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode error = " + query.lastError().text());return programInfoList;}// 行坐标向下移while (query.next()){//获取数据库query所指的那行的数据QString programInfo;programInfo += (QString::number(query.value(0).toInt())+";"); // stepNoprogramInfo += (QString::number(query.value(1).toInt())+";"); // cutNoprogramInfo += (QString::number(query.value(2).toDouble(), 'f', 2) + ";"); // xprogramInfo += (QString::number(query.value(3).toDouble(), 'f', 2) + ";"); // yprogramInfo += (QString::number(query.value(4).toDouble(), 'f', 2) + ";"); // f 速度programInfo += (QString::number(query.value(5).toDouble(), 'f', 2) + ";"); // RxprogramInfo += (QString::number(query.value(6).toDouble(), 'f', 2)); // RyoutPutMsg(QtDebugMsg, "DataModel::queryProgramInfoBySectionCode programInfo = " + programInfo);programInfoList.append(programInfo);}return programInfoList;
}// 更新程序信息
bool DataModel::updateProInfosByProNo(QString proNo, QStringList proInfoList) {// 开启事务if (!db.transaction()) {outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo db.error = " + db.lastError().text());return false;}QStringList programInfoList;// 根据名字查询// 使用索引sectionBarNameQString sqlDel = QString("delete from programInfo where programNo=\'%1\';").arg(proNo);outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo sqlDel = " + sqlDel);// 创建一个可以对db执行语句的对象QSqlQuery query(db);// 执行sql语句bool ret = query.exec(sqlDel);if (!ret){outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo error = " + query.lastError().text());return false;}try {for (int i = 0; i < proInfoList.size(); i++) {QStringList programInfo = proInfoList.at(i).split(";");QString sqlOne = "insert into programInfo values ( " + proNo + ",";for (int j = 0; j < programInfo.size(); j++) {if (j > 0) {sqlOne += ",";}sqlOne += programInfo.at(j) ;}sqlOne += ");";outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo sqlOne = " + sqlOne);if (!query.exec(sqlOne)){outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo error = " + query.lastError().text());return false;}}}catch (...) {outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo error = " + query.lastError().text());return false;}// 开启事务if (!db.commit()) {outPutMsg(QtDebugMsg, "DataModel::updateProInfosByProNo db.error = " + db.lastError().text());return false;}return true;
}
// 保存程序信息
void ClearCorner::on_edit_saveBtn_clicked() {QStringList proInfoList;for (int i = 0; i < modelProgram.rowCount(); i++) {QString strTmp;for (int j = 0; j < modelProgram.columnCount(); j++) {QStandardItem* item = modelProgram.item(i, j);if (j > 0) {strTmp += ";";}strTmp += item->text();}outPutMsg(QtDebugMsg, "ClearCorner::on_edit_saveBtn_clicked strTmp = " + strTmp);proInfoList.append(strTmp);}DataModel dataModel;bool ret = dataModel.updateProInfosByProNo(ui.edit_lineEdit_programNo->text(), proInfoList);if (ret) {QMessageBox::information(nullptr, "提示", "更新程序成功!");}else {QMessageBox::warning(nullptr, "提示", "更新程序失败!");}
}

相关文章:

QT--SQLite

配置类相关的表&#xff0c;所以我使用sqlite,且QT自带该组件&#xff1b; 1.安装 sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575 使用SQLiteExpert建好数据库.db文件&#xff0c;和对应的表后把db文件放在指定目录 ./db/program.db&#xff1b; 2.选择sql组件 3.新…...

【深度学习入门篇 ②】Pytorch完成线性回归!

&#x1f34a;嗨&#xff0c;大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; )&#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 易编橙&#xff1a;一个帮助编程小…...

Syslog 管理工具

Syslog常被称为系统日志或系统记录&#xff0c;是一种用来在互联网协议&#xff08;TCP/IP&#xff09;的网上中传递记录档消息的标准&#xff0c;常用来指涉实际的Syslog 协议&#xff0c;或者那些提交syslog消息的应用程序或数据库。 系统日志协议&#xff08;Syslog&#x…...

硅纪元AI应用推荐 | 百度橙篇成新宠,能写万字长文

“硅纪元AI应用推荐”栏目&#xff0c;为您精选最新、最实用的人工智能应用&#xff0c;无论您是AI发烧友还是新手&#xff0c;都能在这里找到提升生活和工作的利器。与我们一起探索AI的无限可能&#xff0c;开启智慧新时代&#xff01; 百度橙篇&#xff0c;作为百度公司在202…...

Codeforces Round 954 (Div. 3)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;Codeforces 本文用于记录回顾本彩笔的解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送阵 A. X Axis解…...

【Django】报错‘staticfiles‘ is not a registered tag library

错误截图 错误原因总结 在django3.x版本中staticfiles被static替换了&#xff0c;所以这地方换位static即可完美运行 错误解决...

LeetCode 算法:二叉树的最近公共祖先 III c++

原题链接&#x1f517;&#xff1a;二叉树的最近公共祖先 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点…...

Windows CMD 命令汇总表

Windows CMD 命令汇总表 Windows CMD 命令汇总表目录操作磁盘操作文件操作其他命令FTP 命令高级系统命令批处理命令网络命令安全和权限命令 Windows CMD 命令指南目录操作MD - 创建子目录CD - 切换当前目录RD - 删除子目录DIR - 显示目录内容PATH - 设置可执行文件的搜索路径TR…...

【python+appium】自动化测试

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…...

vue 数据类型

文章目录 ref 创建&#xff1a;基本类型的响应式数据reactive 创建&#xff1a;对象类型的响应式数据ref 创建&#xff1a;对象类型的响应式数据ref 对比 reactive将一个响应式对象中的每一个属性&#xff0c;转换为ref对象(toRefs 与 toRef)computed (根据计算进行修改) ref 创…...

MySQL(基础篇)

DDL (Data Definition Language) 数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c; 字段) DML (Data Manipulation Languag) 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改 DQL (Data Query Language) 数据查询语言&#xff0c;用…...

springboot中通过jwt令牌校验以及前端token请求头进行登录拦截实战

前言 大家从b站大学学习的项目侧重点好像都在基础功能的实现上&#xff0c;反而一个项目最根本的登录拦截请求接口都不会写&#xff0c;怎么拦截&#xff1f;为什么拦截&#xff1f;只知道用户登录时我后端会返回一个token&#xff0c;这个token是怎么生成的&#xff0c;我把它…...

从零开始开发视频美颜SDK:实现直播美颜效果

因此&#xff0c;开发一款从零开始的视频美颜SDK&#xff0c;不仅可以节省成本&#xff0c;还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前&#xff0c;首先需要进行详细的需求…...

极验语序点选验证码识别(一)

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 极验文字点选验证码不必多说,很多小伙伴,借助标注工具或者打码平台标注完数据集后,使用开源的目标检测网络即可完成,欢迎收看我之前的文章: Pytorch利用ddddocr辅助识别点选验证码 或者使…...

什么是 HTTP POST 请求?初学者指南与示范

在现代网络开发领域&#xff0c;理解并应用 HTTP 请求 方法是基本的要求&#xff0c;其中 "POST" 方法扮演着关键角色。 理解 POST 方法 POST 方法属于 HTTP 协议的一部分&#xff0c;主旨在于向服务器发送数据以执行资源的创建或更新。它与 GET 方法区分开来&…...

第一次作业

任务需求:1.DMz区内的服务器&#xff0c;办公区仅能在办公时间内(9-18)可以访问&#xff0c;生产区的设备全天可以访问 2.生产区不允许访问互联网&#xff0c;办公区和游客区可以访问互联网 3.办公区设备10.0.2.10不允许访问DMZ区的FTP服务器和http服务器&#xff0c;仅能ping通…...

【机器学习】12.十大算法之一支持向量机(SVM - Support Vector Machine)算法原理讲解

【机器学习】12.十大算法之一支持向量机&#xff08;SVM - Support Vector Machine&#xff09;算法原理讲解 一摘要二个人简介三基本概念四支持向量与超平面4.1 超平面&#xff08;Hyperplane&#xff09;4.2 支持向量&#xff08;Support Vectors&#xff09;4.3 核技巧&…...

使用 `useAppConfig` :轻松管理应用配置

title: 使用 useAppConfig &#xff1a;轻松管理应用配置 date: 2024/7/11 updated: 2024/7/11 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt开发中useAppConfig的使用&#xff0c;它便于访问和管理应用配置&#xff0c;支持动态加载资源、环境配置切换、权限…...

中国内陆水体氮沉降数据集(1990s-2010s)

全球大气氮沉降急剧增加对内陆水生态系统产生不良影响。中国是全球三大氮沉降热点地区之一&#xff0c;为了充分了解氮沉降对中国内陆水体的影响&#xff0c;制定合理的水污染治理方案&#xff0c;我们需要清楚的量化内陆水体的氮沉降通量。为此&#xff0c;我们利用LMDZ-OR-IN…...

qml 实现一个带动画的switch 按钮

一.效果图 》 二.qml 代码 import QtQuick 2.12 import QtQuick.Controls 2.12Switch {id: controlimplicitWidth: 42implicitHeight: 20indicator: Rectangle {id: bkRectangleanchors.fill: parentx: control.leftPaddingy: parent.height / 2 - height / 2radius: height …...

无王无帝定乾坤,来自田间第一人 大道同行赴新程

无王无帝定乾坤&#xff0c;来自田间第一人。 ——题记一、旧世终章&#xff1a;王权尽头的暮色朝代崛起方式落幕原因秦铁血征伐暴政失心汉布衣起义外戚乱政唐门阀更迭藩镇割据……………… “千秋岁月流转&#xff0c;世道几经更迭&#xff0c;无数王朝踏着烽烟崛起&#xff0…...

npm publish前必看:如何用命令行优雅搞定2FA,避免发布包时卡壳

npm publish前必看&#xff1a;如何用命令行优雅搞定2FA&#xff0c;避免发布包时卡壳 在npm生态中&#xff0c;发布包是开发者日常工作中不可或缺的一环。然而&#xff0c;随着安全要求的提高&#xff0c;双因素身份验证&#xff08;2FA&#xff09;已成为保护账户安全的重要措…...

STM32F103C8T6驱动安信可GP-01定位模块:从NMEA数据解析到经纬度显示的完整流程

STM32F103C8T6与安信可GP-01定位模块实战&#xff1a;高精度经纬度解析全指南 在物联网和嵌入式系统开发中&#xff0c;位置服务已成为核心功能之一。无论是资产追踪、导航设备还是智能农业系统&#xff0c;精准的定位能力都是实现这些应用的基础。本文将带你深入探索如何利用S…...

EMD过时了?从故障诊断实战看经验小波变换(EWT)的三大优势

EMD过时了&#xff1f;从故障诊断实战看经验小波变换(EWT)的三大优势 在工业设备状态监测领域&#xff0c;振动信号分析一直是故障诊断的黄金标准。传统方法如经验模态分解(EMD)曾因其自适应特性广受推崇&#xff0c;但工程师们逐渐发现它在处理轴承点蚀、齿轮断齿等典型故障时…...

如何为本地音乐库批量下载同步歌词:LRCGET终极指南

如何为本地音乐库批量下载同步歌词&#xff1a;LRCGET终极指南 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 还在为海量本地音乐文件找不到歌词而烦恼…...

告别HAL库:用GD32标准库为RT-Thread打造轻量级驱动(以F4系列为例)

告别HAL库&#xff1a;用GD32标准库为RT-Thread打造轻量级驱动&#xff08;以F4系列为例&#xff09; 在嵌入式开发领域&#xff0c;HAL库因其跨平台兼容性和易用性广受欢迎&#xff0c;但对于追求极致性能和精简代码的开发者而言&#xff0c;标准库往往能带来更直接的硬件控制…...

从外卖配送范围到跨国航线规划:Geopy距离计算的3个实战场景与避坑经验

从外卖配送范围到跨国航线规划&#xff1a;Geopy距离计算的3个实战场景与避坑经验 在数字化浪潮席卷各行各业的今天&#xff0c;地理距离计算已成为许多商业应用的核心技术组件。无论是外卖小哥的手机App上闪烁的配送范围提示&#xff0c;还是国际物流系统中精确到米的航线规划…...

高效AI专著生成:20万字专著一键搞定,AI写专著工具实测推荐!

学术专著写作挑战与AI工具助力 对于初次尝试编写学术专著的研究者来说&#xff0c;写作过程就像是在“摸索着走过一条未知的小路”&#xff0c;处处都有挑战等待着他们。在选题上常常感到迷惘&#xff0c;难以在“有意义”与“可操作性”之间找到合适的平衡&#xff1a;有的研…...

终极指南:如何在macOS上轻松安装KLayout版图设计软件

终极指南&#xff1a;如何在macOS上轻松安装KLayout版图设计软件 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout 想要在macOS上安装专业级的集成电路版图设计工具KLayout吗&#xff1f;&#x1f60a; 作为一款功能…...

NotebookLM文档召回率骤降73%?(内部实验报告首次公开:BM25+SBERT混合排序实战框架)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM相似文档推荐 NotebookLM 是 Google 推出的基于用户上传文档构建个性化 AI 助手的实验性工具&#xff0c;其核心能力之一是“相似文档推荐”——即在用户提问时&#xff0c;自动从已导入的文…...