一、前言
本文对数据库和table view进行了关联,主要记录QSqlTableModel的使用方法。
二、基本原理和ui界面
QSqlTableModel提供了一个一次只能操作单个SQL表的读写模型,它是QSqlQuery的更高层次的替代品,可以浏览和修改独立的SQL表,并且不需要了解SQL语法。里面提供了多种方法方便进行对数据表的操作。
ui界面如下:由一个tableView和数个button组成
三、详细原理
连接数据库,我用的是MySql的数据库,如果MySql连接遇到问题可以参考我的上一篇文章
设置数据库名,端口,用户和密码,并进行打开
db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName(dbName);
db.setHostName("localhost");
db.setPort(3306);
db.setUserName("root");
db.setPassword("root");
bool ok = db.open();
关联数据库和table view框
设置表名,表头数据,通过setEditStrategy设置不同的编辑策略
QSqlTableModel::OnFieldChange:对模型的所有更改将立即应用于数据库。
QSqlTableModel::OnRowChange:当用户选择其他行时,将应用对行的更改。
QSqlTableModel::OnManualSubmit:所有更改都将缓存在模型中,直到调用 submitAll() 或 revertAll()。
model = new QSqlTableModel(this,db);
model->setTable("Human");
model->setHeaderData(0,Qt::Horizontal,QVariant("ID"));
model->setHeaderData(1,Qt::Horizontal,QVariant("名字"));
model->setHeaderData(2,Qt::Horizontal,QVariant("年龄"));
model->setHeaderData(3,Qt::Horizontal,QVariant("性别"));
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
ui->tableView->setModel(model);
添加:在指定父项的子项中的给定行之前插入一行。
void Widget::on_btn_insert_clicked()
{
model->insertRow(model->rowCount());
}
确定:submitAll提交所有挂起的更改,并在成功时返回 true。出错时返回 false,详细的错误信息可以通过 lastError() 获取。
void Widget::on_btn_sure_clicked()
{
model->submitAll();
}
返回:revertAll()还原挂起的更改
void Widget::on_btn_cancel_clicked()
{
model->revertAll();
model->select();
}
查询:select()使用指定的筛选器和排序条件
void Widget::on_btn_select_clicked()
{
model->select();
}
删除:removeRow()从指定父项的子项中删除给定行
void Widget::on_btn_delete_clicked()
{
int selectRow = ui->tableView->currentIndex().row();
if(selectRow < 0)
{
return;
}
model->removeRow(selectRow);
model->submitAll();
}
升序:setSort :AscendingOrder,升序排列
void Widget::on_btn_asc_clicked()
{
model->setSort(0,Qt::AscendingOrder);
model->select();
}
降序:setSort :DescendingOrder,降序排列
void Widget::on_btn_desc_clicked()
{
model->setSort(0,Qt::DescendingOrder);
model->select();
}
事物:transaction,返回由参数类型指定的数据库表、系统表和视图的列表
rollback():如果驱动程序支持事务并且已启动 transaction(),则回滚数据库上的事务
commit():如果驱动程序支持事务并且已启动 transaction(),则将事务提交到数据库
void Widget::on_btn_trans_clicked()
{
//申明一个事物
model->database().transaction();
int selectRow = ui->tableView->currentIndex().row();
if(selectRow < 0)
{
return;
}
model->removeRow(selectRow);
bool ret = model->submitAll();
if(ret)
{
int ret = QMessageBox::information(this,"delete tip","你确定要删除选中的行?",
QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
if(ret == QMessageBox::No)
{
model->database().rollback();
}
else
{
model->database().commit();
}
}
}