QSqlDatabase(2)实例,QTableView显示数据库表数据
目录
前言
1、实现的功能
2、具体的代码实现
前言
想了解QSqlDatabase基本知识的,以及增删改查的用法,可以浏览上一篇文章:
QSqlDatabase(1)基本接口,以及(增删改除)的简单实例_Ivy_belief的博客-CSDN博客
这篇主要实战,写了一个数据动态库。
1、实现的功能
先来看看要实现的页面信息:

数据库的动态库主要实现了:数据库的增、删、改、查的功能。
(1)增加数据的功能;
(2)删除数据的功能;
(3)修改数据的功能;
(4)查找数据的功能;
(5)用QTableView显示数据库表数据;
(6)直接执行sql语句的功能;
2、具体的代码实现
数据库测试工具GUI页面的主要功能:
(1)增加数据:
bool RobotDataBaseManager::addData2DB(string strOrderId, string strEntry, string strMoney, string strPlate, string strType, string strWeight)
{if (isOrderIdExist(strOrderId))return false;QString orderId = QString::fromStdString(strOrderId);QString entry = QString::fromStdString(strEntry);QString money = QString::fromStdString(strMoney);QString plate = QString::fromStdString(strPlate);QString type = QString::fromStdString(strType);QString weight = QString::fromStdString(strWeight);QSqlQuery query;QString sql = "INSERT INTO orderData (orderId, entry, money, plate, type, weight) VALUES (:orderId, :entry, :money, :plate, :type, :weight);";query.prepare(sql);query.bindValue(":orderId", orderId);query.bindValue(":entry", entry);query.bindValue(":money", money);query.bindValue(":plate", plate);query.bindValue(":type", type);query.bindValue(":weight", weight);if (!query.exec()){qDebug()<<tr("订单Id %1 ,加入缓存失败:%2").arg(orderId).arg(query.lastError().text());return false;}qDebug()<<tr("订单Id %1 已加入缓存").arg(orderId);return true;
}
(2)删除数据的功能;
bool RobotDataBaseManager::DeleteDataById(string strOrderId)
{qDebug() << "RobotDataBaseManager::DeleteDataById: " << QString::fromStdString(strOrderId);QString orderId = QString::fromStdString(strOrderId);QSqlQuery query;QString sql = "DELETE FROM orderData WHERE orderId=:orderId;";query.prepare(sql);query.bindValue(":orderId", orderId);if (!query.exec()){qDebug() << "into DeleteDataById ERROR: " << query.lastError().text();return false;}if(m_mutex4OrderId.tryLock(1*1000)==false)return false;m_curOrderId = orderId;m_mutex4OrderId.unlock();return true;
}
(3)修改数据的功能;
bool RobotDataBaseManager::UpdateDataById(string strOrderId, string strEntry, string strMoney, string strPlate, string strType, string strWeight)
{if (!isOrderIdExist(strOrderId))return false;QString orderId = QString::fromStdString(strOrderId);QString entry = QString::fromStdString(strEntry);QString money = QString::fromStdString(strMoney);QString plate = QString::fromStdString(strPlate);QString type = QString::fromStdString(strType);QString weight = QString::fromStdString(strWeight);qDebug()<< "orderId: " << orderId;qDebug()<< "entry: " << entry;qDebug()<< "money: " << money;qDebug()<< "plate: " << plate;qDebug()<< "type: " << type;qDebug()<< "weight: " << weight;QSqlQuery query;QString sql = "UPDATE orderData SET entry = :entry, money = :money, plate = :plate, type = :type, weight = :weight WHERE orderId=:orderId;";query.prepare(sql);query.bindValue(":orderId", orderId);query.bindValue(":entry", entry);query.bindValue(":money", money);query.bindValue(":plate", plate);query.bindValue(":type", type);query.bindValue(":weight", weight);if (!query.exec()){qDebug() << "UpdateDataById ERROR: " << query.lastError().text();return false;}if(m_mutex4OrderId.tryLock(1*1000)==false)return false;m_curOrderId = orderId;m_mutex4OrderId.unlock();return true;
}
(4)查找数据的功能;
bool RobotDataBaseManager::getDataById(string strOrderId, string& strEntry, string& strMoney, string& strPlate, string& strType, string& strWeight)
{qDebug() << "[数据库]:getDataById 查询所有数据: 开始~~~~~~~~~~~~~~~~~";QString orderId = QString::fromStdString(strOrderId);QSqlQuery query;QString sql = "SELECT * FROM orderData WHERE orderId=:orderId;";query.prepare(sql);query.bindValue(":orderId", orderId);if (!query.exec()){qDebug() << "into getDataById ERROR: " << query.lastError().text();return false;}while (query.next()){QString orderId = query.value("orderId").toString();qDebug() << "取得1条订单缓存数据: " << orderId;if (!orderId.isEmpty()){strEntry = query.value("entry").toString().toStdString();strMoney = query.value("money").toString().toStdString();strPlate = query.value("plate").toString().toStdString();strType = query.value("type").toString().toStdString();strWeight = query.value("weight").toString().toStdString();}}query.exec("SELECT * FROM orderData");qDebug() << "[数据库]:SELECT * FROM orderData:";while (query.next()){// 读取字段值QString name = query.value("entry").toString();QString money = query.value("money").toString();QString plate = query.value("plate").toString();QString type = query.value("type").toString();QString weight = query.value("weight").toString();// 输出结果qDebug() << "entry:" << name << ", money:" << money << ", plate:" << plate << ", type:" << type << ", weight:" << weight;}qDebug() << "[数据库]:getDataById 查询所有数据: 结束~~~~~~~~~~~~~~~~~";return true;
}
(5)用QTableView显示数据库表数据;
void RobotDataBaseManager::on_btn_showAll_clicked()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Connection1");db.setDatabaseName("trawe.db"); // 数据库文件名if (!db.open()){qDebug() << "Failed to connect to database 1.";return;}QSqlQuery query(db);QString selectQuery = "SELECT * FROM orderData";if (!query.exec(selectQuery)){qDebug() << "Failed to select data from trawe.db.";return;}QSqlTableModel * model = new QSqlTableModel(this,db);model->setTable("orderData");ui->tableView->setModel(model);model->select();QStringList tables;tables << "id"<< "订单id" << "入口" << "金额" << "车牌" << "车型" << "重量" << "时间";for(int i = 1 ; i < tables.count(); i++)model->setHeaderData(i,Qt::Horizontal,tables[i]);//设置显示框表头显示model->setSort(1, Qt::AscendingOrder);//设置按照第0列排序ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置单元格不可编辑ui->tableView->horizontalHeader()->setStretchLastSection(true);//设置最后一列填充后面表格//ui->tableView->setColumnHidden(0,true);//设置第0行隐藏ui->tableView->setColumnWidth(1,100);//设置列宽,界面看起来更舒适ui->tableView->setColumnWidth(2,100);//设置列宽,界面看起来更舒适
}
(6)直接执行sql语句的功能;
/*
(1)INSERT INTO orderData (orderId, entry, money, plate, type, weight) VALUES ("63945", "滘口", "99", "粤A777Q1", "客一", "1800");
(2)UPDATE orderData SET entry = "滘口", money = "99", plate = "粤A777Q1", type = "客一", weight = "客一" WHERE orderId="22834";
(3)DELETE FROM orderData WHERE orderId=1234567;
*/
bool RobotDataBaseManager::queryExec(string strSql)
{QString sql = QString::fromStdString(strSql);QSqlQuery query;query.prepare(sql);if (!query.exec()){qDebug() << " queryExec ERROR: " << query.lastError().text();return false;}qDebug() << "[数据库]: sql 语句执行成功: 结束~~~~~~~~~~~~~~~~~";return true;
}
上面基本也涵盖主要的代码了。
完整的项目代码已上传,需要的可以下载。
QSqlDatabase实现数据库的基本功能,以及QTableView显示数据库表数据资源-CSDN文库
相关文章:
QSqlDatabase(2)实例,QTableView显示数据库表数据
目录 前言 1、实现的功能 2、具体的代码实现 前言 想了解QSqlDatabase基本知识的,以及增删改查的用法,可以浏览上一篇文章: QSqlDatabase(1)基本接口,以及(增删改除)的简单实例_Ivy_belief的博客-CSDN…...
vue3 监听props 的变化
再三说明 仅仅个人学习用,不误导别人 我觉得props 会创建对应的属性,去接受这些值,比如传递一个ref的基本值 age props.age age.value 传递一个ref的引用值 person props.person person.value 传递一个reactive的引用值 person props.person…...
Docker容器
1、什么是docker,为什么要使用docker 有了docker,可以获取各种软件的镜像,将软件的镜像下载到linux中,基于这个镜像就能够去启动这个容器,这个容器就是这个镜像的完整运行环境,比如mysql、redis、nginx,还能秒级启动他…...
spring 请求等问题
1.post请求 /*** desc: (gateway主要接收前端请求 , 然后对请求的数据进行验证 , 验证之后请求反向代理到服务器 。*当请求 method 为 GET 时 , 可以顺利通过gateway 。 当请求 method 为 POST 时 , gateway则会报如下错误 。*jav…...
汽车制造行业,配电柜如何实施监控?
工业领域的生产过程依赖于高效、稳定的电力供应,而配电柜作为电力分配和控制的关键组件,其监控显得尤为重要。 配电柜监控通过实时监测、数据收集和远程控制,为工业企业提供了一种有效管理电能的手段,从而确保生产的连续性、安全性…...
stable diffusion实践操作-VAE
本文专门开一节写图生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 大部分底模有VAE,但是部分底模没有VAE,需要专门下载VAE才能使用。 最常用的VAE:vae-ft-mse-840000-ema-pruned 用来饱…...
《Flink学习笔记》——第一章 概念及背景
什么是批处理和流处理,然后由传统数据处理架构为背景引出什么是有状态的流处理,为什么需要流处理,而什么又是有状态的流处理。进而再讲解流处理的发展和演变。而Flink作为新一代的流处理器,它有什么优势?它的相关背…...
顺序表链表OJ题(2)->【数据结构】
W...Y的主页 😊 代码仓库分享 💕 前言: 单链表的结构常常不完美,没有双向链表那么”优秀“,所以繁衍出很多OJ练习题。今天我们继续来look look数据结构习题。 下面就是OJ时间!!! …...
css3有哪些新特性?(包含哪些模块)
css3有哪些新特性?包含哪些模块?以下是整理的21个css3新特性: 1.新增选择器 p:nth-child(n){color: rgba(255, 0, 0, 0.75)} 2.新增伪元素 ::before 和 ::after 3.弹性盒模型 display: flex; 4.多列布局 column-count: 5; 5.媒体查询 media (max-width:…...
【Grasshopper基础15】“右键菜单似乎不太对劲”
距离上一篇文章已经过去了挺久的,很长时间没有写GH基础部分的内容了,原因其一是本职工作太忙了,进度也有些落后,白天工作累成马,回家只想躺着;其二则是感觉GH基础系列基本上也介绍得差不多了,电…...
华为Mate60低调发布,你所不知道的高调真相?
华为Mate60 pro 这两天的劲爆新闻想必各位早已知晓,那就是华为Mate60真的来了!!!并且此款手机搭载了最新国产麒麟9000s芯片,该芯片重新定义了手机性能的巅峰。不仅在Geekbench测试中表现出色,还在实际应用…...
C++(18):命名空间
多个库将名字放置在全局命名空间中将引发命名空间污染。 命名空间可以用来防止名字冲突,它分割了全局命名空间,其中每个命名空间是一个作用域。通过在某个命名空间中定义库的名字,库的作者(以及用户)可以避免全局名字…...
K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(上)
温故知新 📚第一章 前言📗背景📗目的📗总体方向 📚第二章 基本环境信息📗机器信息📗软件信息📗部署用户kubernetes 📚第三章 Kubernetes各组件部署📗安装kube…...
生产环境部署与协同开发 Git
目录 一、前言——Git概述 1.1 Git是什么 1.2 为什么要使用Git 什么是版本控制系统 1.3 Git和SVN对比 SVN集中式 Git分布式 1.4 Git工作流程 四个工作区域 工作流程 1.5 Git下载安装 1.6 环境配置 设置用户信息 查看配置信息 二、git基础 2.1 本地初始化仓库 编辑…...
Qt/C++编写视频监控系统80-远程回放视频流
一、前言 远程回放NVR或者服务器上的视频文件,一般有三种方式,第一种是调用厂家的SDK,这个功能最全,但是缺点明显就是每个厂家的设备都有自己的SDK,只兼容自家的设备,如果你的软件需要接入多个厂家的&…...
用于设计和分析具有恒定近心点半径的低推力螺旋轨迹研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
MongoDB - 构造复杂查询条件执行查询
文章目录 1. 构造 keyword 的查询条件2. 构造 threatSubType 的查询条件3. 相应的实体类 /*** 查询白名单详情** param offset 第几页开始* param limit 每页显示的最大值* param keyword 模糊搜索值* param order 排序方式(升序/降序…...
如何从ChatGPT中获得最佳聊天对话效果
从了解ChatGPT工作原理开始,然后从互动中学习,这是一位AI研究员的建议。 人们利用ChatGPT来撰写文章、论文、生成文案和计算机代码,或者仅仅作为学习或研究工具。然而,大多数人不了解它的工作原理或它能做什么,所以他…...
深入浅出:手把手教你实现单链表
一、什么是链表 链表是一种链状数据结构。简单来说,要存储的数据在内存中分别独立存放,它们之间通过某种方式相互关联。 如果我们使用C语言来实现链表,需要声明一个结构体作为链表的结点,结点之间使用指针关联。 二、单向链表的结…...
vite 打包项目后访问显示空白页的问题,开发环境正常,生产环境无报错。
有没有可能, 你跟我遇到同样的问题 白屏的写法 const routes [{path: /,component: import(../views/index.vue),} ]正确的写法 const routes [{path: /,component: () > import(../views/index.vue),} ]有时候方向很重要,当在错误的方向上无脑冲…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
