相信大家肯定见过系统里面的系统日志,每一次的开机时间,每一次数据的传输,都记录在操作日志里。但是,系统是如何存储这些数据不丢失的呢?答案就是—-数据库。它就像单片机的flash一样,如果不删除,信息就会一直保存。每次开机我们将数据选择性的读取出来进行显示。
数据库几乎是每个较大的软件所必须应用的,在QT中也使用QtSql模块对数据库的完美支持,使用这个模块,我们需要加入头文件:#include,而在工程文件中需要加入:QT += sql。
其中,qt支持以下几种数据库,其中mysql和sqlite应用的比较广,我们今天的测试例程应用的是sqlite。
比较mysql和sqlite,简单来说,sqlite功能简约,小型化,追求最大磁盘效率。而mysql功能全面,综合化,追求最大并发效率。如果只是单机上来用的话,数据量不是很大,需要方便移植或者需要频繁读写文件的话,用sqlite比较合适。而且qt自带sqlite数据库。不需要再安装。
嘻嘻,运行数据库首先肯定得先创建一个数据库了,我感觉sqlite的操作还是很简单的。基本上创建、打开、插入、删除、查询的代码都是一样的,可以封装成一个类,哪里需要那里引用。
头文件中先QSqlDatabase m_db,建立一个QSqlDatabase对象
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语句的函数,后面我们的查询、插入、删除等操作都会调用这个函数。
bool QtSqlLiteTest::sqlQuery(const QString sql) { QSqlQuery query; bool queryRet = query.exec(sql); if(!queryRet) { qDebug() << (sql + " query fail"); } return queryRet; }
把需要执行的sql语句以QString的形式写到exec()函数的参数中。然后。看你啥需要了。不过这些插入、删除这些操作都是基于你有个表格。哈哈 ,先创建一个名为test表格。表格包括三列(a、b、c),b的类型是字符型。
QString createTablaSql = "create table test (a int primary key, b varchar(30), c int)"; sqlQuery(createTablaSql);
2. 插入数据
QString createTablaSql = "insert into test values('1','a','1')"; sqlQuery(createTablaSql);
3. 查询数据
QString createTablaSql = "select a,b,c from test"; sqlQuery(createTablaSql);
4. 删除数据
QString createTablaSql = "delect from test where a = ?"; sqlQuery(createTablaSql);
5. 清空表格
QString createTablaSql = "delect from test "; sqlQuery(createTablaSql);
软件:qtcreate
平台:虚拟机或者ARM平台
我们先来看一下运行的效果:
在两个编辑框中输入我们想要插入的数据,点击插入,数据就被存到了当前的tableview中,使用MVC模式,插入数据会自动更新列表,同时存入数据库中。看一下updata函数。
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。
void QtSqlLiteTest::showContextmenu(const QPoint& point) { QMenu *menu = new QMenu(m_tableView); menu->addAction(("删除"), this, SLOT(delData())); menu->exec(QCursor::pos()); } void QtSqlLiteTest::delData() { int row = m_tableView->currentIndex().row(); m_model->removeRow(row); updateData(); }
OK,我们和之前一样建立一个工程,然后建立一个类, 把创建、删除、插入等这些哈数都放到里面
插入的表格名称,包含的表头都需要在头文件中进行申明,否则调用的时候就会出错。执行SQL语句。initWidget就是生成的界面。initModel是生成模板,设置表格的名字等参数,同时将显示数据的tableview和建立的模板联系起来。用到了setModel函数,设置tableview的参数。
最后,我们的代码就放到工程链接里面吧,都加了注释,很容易看懂,就是里面的界面不是设计模式生成的,大家也可以参考下面的界面进行设计。
->
木得总结,哈哈,都很简单的小例程,适合稍微有点基础的初学者。工程链接:阅读全文获取
树莓派8G版 现货
原价648元,活动价:589元 起
超心动,立即购买