32

Qt数据库与QTableWidget结合的增删改查

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUxMTk4MzY3MA%3D%3D&%3Bmid=2247484291&%3Bidx=1&%3Bsn=f179977ca19ebf3fd41537e4072e440f
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多老铁~

大家好!再过一段时间是2020年的农历新年,预祝大家新年安康!

之前和大家简单介绍过Qt Sqlite数据库的使用,不过过于简单,这次结合 QTableWidget 一起再次介绍下。

一、  基础知识

1. SQLite简介

SQLite( sql )是一款开源轻量级的数据库软件,不需要 server ,可以集成在其他软件中,非常适合嵌入式系统。

Qt5 以上版本可以直接使用 SQLite Qt 自带驱动)。

2.  引入 SQL 模块 Qt 项目文件 (.pro 文件 ) 中,加入 SQL 模块:

QT       += sql

3. Ubuntu下数据库 SQLite 查看软件

SQLite database browser  

二、  程序功能简介

程序先添加数据库、设置数据库名称,之后判断‘ studenttable 是否存在,不存在则创建;创建后添加数据作为 QTableWidget 的初始化显示。

程序中数据库与QTableWidget结合,实现增、删、改、查等基础功能。

QTableWidget实现了动态添加 Item 的小功能。

三、  各模块程序功能介绍

1. 头文件

#include <QSqlDatabase>

#include <QSqlQuery>

#include <QSqlError>

2. 检查连接、添加数据库驱动、设置数据库名称。

if (QSqlDatabase::contains("dh_sql_default_connection"))

{

m_db = QSqlDatabase::database("dh_sql_default_connection");


qDebug() << "contains";

}

else

{

m_db = QSqlDatabase::addDatabase(

"QSQLITE", "dh_sql_default_connection");


m_db.setDatabaseName("mydb.db");

}

addDatabase() 的参数 QSQLITE SQLite 对应的驱动名,不能改。

setDatabaseName()的参数是数据库文件名。如果数据库不存在则自动创建;如果存在,则之后的操作会在已有的数据库上进行。

用户名,密码可以随便取,也可以省略,本例子中省略。

不过一直没有进入else,以后有时间探索下。

3. 创建表单以及查询表单是否存在

if(m_db.open()==true)

{

QSqlQuery query(m_db);


QString tableName = "student";


bool isTableExist = m_db.tables().contains(tableName);


if(!isTableExist)

{

// create table

bool ret = query.exec(QString("create table %1(id int ,name varchar(255))").arg(tableName));

qDebug() << "create table ret" << ret << "table does not exist";


initDatabaseData(); //初始化添加三条数据

}

else

{

qDebug() << "table exists";

}

}

创建 student 表单,两个是数据分别是 id(int) name( varchar )

使用int tableExist = query.exec(QString("select count(*) from sqlite_master \

where type='table' and name='%1'").arg(tableName));

这个进行查询,总是返回true,所以使用了 Qt 自带的查询方式。

bMJZJze.png!web

4. 一些函数

①  initDatabaseData()

void DataBaseWidget::initDatabaseData()

{

if(m_db.open()==true)

{

QSqlQuery query(m_db);

if(query.exec("insert into student values(0,'大皮')"))

{

qDebug("insert data 大皮 success");

}


if(query.exec("insert into student values(1,'中皮')"))

{

qDebug("insert data 中皮 success");

}


if(query.exec("insert into student values(2,'小皮')"))

{

qDebug("insert data 小皮 success");

}

}

}

②  更新QTableWidget

void DataBaseWidget::updataTablewidgetData()

{

if(true == m_db.open())

{

QSqlQuery query(m_db);

if(query.exec("select * from student"))

{

ui->tableWidget->clearContents();

ui->tableWidget->setRowCount(0);


while(query.next())

{

int rowCount = ui->tableWidget->rowCount();


ui->tableWidget->insertRow(rowCount);


QTableWidgetItem *columnItem0 = new QTableWidgetItem(

query.value(0).toString());

QTableWidgetItem *columnItem1 = new QTableWidgetItem(

query.value(1).toString());


ui->tableWidget->setItem(rowCount,0, columnItem0);

ui->tableWidget->setItem(rowCount,1, columnItem1);


}

}

}

}

这里面主要是QTableWidget的动态增加行数。遍历数据库中 idname 后显示到 QTableWidget 上。

③  插入数据

void DataBaseWidget::on_pbn_insertData_clicked()

{

if(m_db.open()==true)

{

QString id = ui->le_id->text();

QString name = ui->le_name->text();


QSqlQuery query(m_db);

if(query.exec(QString("insertin to student

values(%1,'%2')").arg(id).arg(name)))

{

qDebug("insert data success");

}

}


updataTablewidgetData();

}

Sql 插入数据指令:

query.exec(QString("insertin   to   student values(%1,'%2')").arg(id).arg(name))

④  删除数据

void DataBaseWidget::on_pbn_deleteData_clicked()

{

if(m_db.open())

{

QString id = ui->tableWidget->item(m_row, 0)->text();

QString name = ui->tableWidget->item(m_row, 1)->text();


QSqlQuery query(m_db);


if(query.exec(QString("delete from student where id=%1 and name='%2'")

.arg(id).arg(name)))

{

qDebug("delete data success!");

}

}


updataTablewidgetData();

}

Sql 删除数据指令:

query.exec(QString("delete from student where id=%1 and name='%2'")

.arg(id).arg(name))

⑤ 修改数据

void DataBaseWidget::on_pbn_changeData_clicked()

{

if(m_db.open())

{

QString id = ui->tableWidget->item(m_row, 0)->text();

QString name = ui->tableWidget->item(m_row, 1)->text();


QSqlQuery query(m_db);

if(query.exec(QString("update student set name='%1' where id=%2")

.arg(name).arg(id)))

{

qDebug("update data success");

}


updataTablewidgetData();

}

}

Sql 修改数据指令:

query.exec(QString("update student set name='%1' where id=%2")

.arg(name).arg(id))

5. 程序效果

① 插入数据

363yYjR.png!web

②更改数据

viERJjV.png!web

6.  小结

之前总结过一个比较简单的SQlite Qt 的用法,这次在之前基础上又完善了一些。之后可以再添加数据库事务的用法以及连接池的用法。

一般嵌入式系统,在数据量不大的情况下使用SQlite 就够用了。

最后祝大家鼠年平安!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK