一、前提
--pro文件添加sql模块
QT += core gui sql
二、使用
说明
--用于与数据库建立连接
QSqlDatabase
--执行各种sql语句
QSqlQuery
--提供数据库特定的错误信息
QSqlError
查看qt支持的驱动
QStringList list = QSqlDatabase::drivers();
qDebug()<<list;
连接 sqlite3 数据库
声明:
#include <QSqlDatabase>
QSqlDatabase db; //该类对象,就相当于一个数据库
实现:
--通常放在构造函数中
// 加载驱动
db = QSqlDatabase::addDatabase("QSQLITE"); //QSQLITE驱动--连接的是sqlite3数据库
//连接成功,返回一个数据库对象
// 设置数据库名
db.setDatabaseName("company.db");//数据库文件后缀:.db
// 打开数据库
if(!db.open()) //open打开成功返回 true
{
qDebug()<<"数据库打开失败:"<<db.lastError(); //lastError:返回有关数据库上发生的最后一个错误的信息。
}
执行 sql 语句
// 创建对象
QSqlQuery query; //创建该对象是,系统自动完成和数据库的关联
// 定义一条创建表的sql语句
QString createTable = "create table staffInformation (id integer, name varchar(20), age int) ";
// 执行sql语句
if(!query.exec(createTable)){
qDebug() <<"create table error:" <<db.lastError();
}
// 插入数据
QString insertData = "insert into staffInformation(id, name, age) values(1, 'chen', 18)";
// 执行sql语句
if(!query.exec(insertData)){
qDebug() <<"insert data error:" <<db.lastError();
}
// 查询数据
QString selectData = "select * from staffInformation";
// 执行sql语句
if(!query.exec(selectData)){
qDebug() <<"select data error:" <<db.lastError();
}else{
while (query.next()) {
qDebug() <<query.value("id").toUInt()
<<query.value("name").toString()
<<query.value("age").toUInt();
}
}
//删除数据
QString deleteData = "delete from staffInformation where id = 1;";
// 执行sql语句
if(!query.exec(deleteData)){
qDebug() <<"delete data error:" <<db.lastError();
}
// 更新数据
QString updateData = "update staffInformation set name = 'yuan' where id = 1;";
// 执行sql语句
if(!query.exec(updateData)){
qDebug() <<"update data error:" <<db.lastError();
}
使用 QSqlQueryModel 模型查询数据( QSqlQUeryModel 默认是只读数据模型)
// 创建对象,并设置表头信息
QSqlQueryModel *model = new QSqlQueryModel;
// 执行sql语句
model->setQuery("select * from staffInformation"); //将查询的结果转换成model对象(结果集)
// 根据需求设置表头信息
model->setHeaderData(0, Qt::Horizontal, "id");
model->setHeaderData(1, Qt::Horizontal, "name");
model->setHeaderData(2, Qt::Horizontal, "age");
// 给ui控件设置模型
QTableView *tableView = new QTableView(this);
tableView->setFixedSize(this->width(), this->height());//设置tableView大小
tableView->setModel(model); //传入表格模型
tableView->show(); //显示表格
使用 QSqlQueryModel 模型修改数据
1,创建一个类,重写 QSqlQueryModel 虚函数
public:
//重写基类虚函数
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); //修改数据库数据
Qt::ItemFlags flags(const QModelIndex &index) const; // 表格可编辑状态设置
private:
//自定义函数接口
void refresh();//更新数据
bool setName(int useId, const QString &name);//根据需求修改表中的数据
//修改数据库数据
bool eidtQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
//判断是否有效列
if(index.column() < 1 || index.column() > 3)
return false;
//获取列对应的 id
QModelIndex prinmaryIndex = QSqlQueryModel::index(index.row(), 0);
int id = this->data(prinmaryIndex).toInt(); //获取表中字段的 id
// 在修改行时,将整个model清空
this->clear();
//根据需求修改对应的列
bool ok = false ;
if(index.column() == 1)
{
ok = setName(id, value.toString());
}
//刷新数据
refresh();
return ok;
}
// 表格可编辑状态设置
Qt::ItemFlags eidtQueryModel::flags(const QModelIndex &index) const
{
// 获取原有单元格的编辑状态
Qt::ItemFlags flag = QSqlQueryModel::flags(index);
// 给原有标志位增加一个可编辑的标志
if(index.column() == 1) //仅限第一列可编辑
flag = flag | Qt::ItemIsEditable; //给它设置一个可编辑的状态
return flag;
}
//更新数据
void eidtQueryModel::refresh()
{
//相当于将数据库的数据查询出来,转换成一个model
this->setQuery("select * from staffInformation");
this->setHeaderData(0, Qt::Horizontal, "name"); //设置表头
}
//根据需求修改表中的数据
bool eidtQueryModel::setName(int useId, const QString &name)
{
//相当于一个刷新操作
QSqlQuery query;
query.prepare("update staffInformation set name = ? where id = ?");
query.addBindValue(name);
query.addBindValue(useId);
return query.exec();
}
2,使用
// 创建模型对象
eidtQueryModel *model = new eidtQueryModel;
//执行sql
model->setQuery("select id, name, age from staffInformation");
//设置表头
model->setHeaderData(0, Qt::Horizontal, "id");
model->setHeaderData(1, Qt::Horizontal, "name");
model->setHeaderData(2, Qt::Horizontal, "age");
//给ui控件设置模型
QTableView *tableView = new QTableView(this);
tableView->setFixedSize(this->width(), this->height());//设置tableView大小
tableView->setModel(model);// 传入表格模型
tableView->show(); // 显示表格
三、其他