电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
QT中如何使用数据库保存系统信息
分 享
扫描二维码分享
QT中如何使用数据库保存系统信息
Qt
数据库
linux
大斯
关注
发布时间: 2020-06-02
丨
阅读: 1060
# 前言 相信大家肯定见过系统里面的系统日志,每一次的开机时间,每一次数据的传输,都记录在操作日志里。但是,系统是如何存储这些数据不丢失的呢?答案就是---数据库。它就像单片机的flash一样,如果不删除,信息就会一直保存。每次开机我们将数据选择性的读取出来进行显示。 # 数据库 数据库几乎是每个较大的软件所必须应用的,在QT中也使用QtSql模块对数据库的完美支持,使用这个模块,我们需要加入头文件:#include
,而在工程文件中需要加入:QT += sql。 其中,qt支持以下几种数据库,其中mysql和sqlite应用的比较广,我们今天的测试例程应用的是sqlite。 ![](https://cf02.ickimg.com/bbsimages/202006/5c017cd13e5a53f14c444c1b1d54ee35.png) 比较mysql和sqlite,简单来说,sqlite功能简约,小型化,追求最大磁盘效率。而mysql功能全面,综合化,追求最大并发效率。如果只是单机上来用的话,数据量不是很大,需要方便移植或者需要频繁读写文件的话,用sqlite比较合适。而且qt自带sqlite数据库。不需要再安装。 # 数据库操作 嘻嘻,运行数据库首先肯定得先创建一个数据库了,我感觉sqlite的操作还是很简单的。基本上创建、打开、插入、删除、查询的代码都是一样的,可以封装成一个类,哪里需要那里引用。 ### - 数据库创建 头文件中先**QSqlDatabase m_db**,建立一个QSqlDatabase对象 ```cpp bool Sqllite::createDB() { if (QSqlDatabase::contains("qt_sql_default_connection")) { m_db = QSqlDatabase::database("qt_sql_default_connection"); } else { m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db->setDatabaseName("MyDataBase.db"); } bool openRet = m_db.open(); return openRet; } ``` 检查指定的连接是否存在,默认的名称是qt_sql_default_connection,如果存在,则返回true,如果不存在,就需要我们创建连接,添加数据库。注意,**addDatabase**的参数**QSQLITE**是sqlite对应的驱动,不能修改。还有第二个参数,就是qt的连接名称,如果只是处理单个数据库文件的话第二个参数就可以省略。 ### - 数据库打开和关闭 打开数据库的话就是调用open函数。 关闭数据库的话就是调用close函数。 ### - 数据库的表格操作 对于表格的操作需要智行sql语句。如果大家不懂sql语句的话可以简单搜索一下,还是比较通俗易懂的。稍微看看就能了解这些语句代表啥意思。 **1. 创建表格** 定义一个执行SQL语句的函数,后面我们的查询、插入、删除等操作都会调用这个函数。 ```cpp bool QtSqlLiteTest::sqlQuery(const QString sql) { QSqlQuery query; bool queryRet = query.ex
ec(sql); if(!queryRet) { qDebug() << (sql + " query fail"); } return queryRet; } ``` 把需要执行的sql语句以QString的形式写到**ex
ec()**函数的参数中。然后。看你啥需要了。不过这些插入、删除这些操作都是基于你有个表格。哈哈 ,先创建一个名为test表格。表格包括三列(a、b、c),b的类型是字符型。 ```cpp QString createTablaSql = "cr
eate table test (a int primary key, b varchar(30), c int)"; sqlQuery(createTablaSql); ``` **2. 插入数据** ```cpp QString createTablaSql = "in
sert into test values('1','a','1')"; sqlQuery(createTablaSql); ``` **3. 查询数据** ```cpp QString createTablaSql = "se
lect a,b,c from test"; sqlQuery(createTablaSql); ``` **4. 删除数据** ```cpp QString createTablaSql = "delect from test where a = ?"; sqlQuery(createTablaSql); ``` **5. 清空表格** ```cpp QString createTablaSql = "delect from test "; sqlQuery(createTablaSql); ``` # 软件设计 - 软件:qtcreate - 平台:虚拟机或者ARM平台 我们先来看一下运行的效果: ![](https://cf02.ickimg.com/bbsimages/202006/c96cb55d00b8408719ad3e39b8ecd336.png) 在两个编辑框中输入我们想要插入的数据,点击插入,数据就被存到了当前的tableview中,使用MVC模式,插入数据会自动更新列表,同时存入数据库中。看一下**updata**函数。 ```cpp bool QtSqlLiteTest::updateData() { bool commitState = false; m_model->database().transaction(); //开始事务操作 if (m_model->submitAll()) // 提交所有被修改的数据到数据库中 { commitState = m_model->database().commit(); //提交成功,事务将真正修改数据库数据 } else { m_model->database().rollback(); //提交失败,事务回滚 } if(!commitState) {qDebug() << m_model->lastError().text();}; return commitState; } ``` 修改数据和删除数据时可以调用此函数。比如我们右键点击出去删除按键,点击删除,数据库和列表中的数据就删除了。这个就是上节说到的信息和槽,嘿嘿!只是这个槽函数里面又调用了槽函数delData。 ```cpp void QtSqlLiteTest::showContextmenu(const QPoint& point) { QMenu *menu = new QMenu(m_tableView); menu->addAction(("删除"), this, SLOT(delData())); menu->ex
ec(QCursor::pos()); } void QtSqlLiteTest::delData() { int row = m_tableView->currentIndex().row(); m_model->removeRow(row); updateData(); } ``` OK,我们和之前一样建立一个工程,然后建立一个类, 把创建、删除、插入等这些哈数都放到里面 ![](https://cf02.ickimg.com/bbsimages/202006/c072f4dcdb510f1ed7ab1a60c40f989e.png) 插入的表格名称,包含的表头都需要在头文件中进行申明,否则调用的时候就会出错。执行SQL语句。**initWidget**就是生成的界面。**initModel**是生成模板,设置表格的名字等参数,同时将显示数据的tableview和建立的模板联系起来。用到了**setModel**函数,设置tableview的参数。 最后,我们的代码就放到工程链接里面吧,都加了注释,很容易看懂,就是里面的界面不是设计模式生成的,大家也可以参考下面的界面进行设计。 #### **注:“->”符号在此网站的代码编辑显示中会变成下面这个:** ```cpp -> ``` ![](https://cf02.ickimg.com/bbsimages/202006/ba745782503d41764321af68e24a66be.png) # 总结 木得总结,哈哈,都很简单的小例程,适合稍微有点基础的初学者。 工程连接:https://github.com/luchenqun/QtSqlLiteTest.git
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
大斯
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交