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),} ]有时候方向很重要,当在错误的方向上无脑冲…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
