Qt数据库操作(三) – 使用SQL模型类
Qt 提供了3个高级的类来访问数据库,分别是QSqlQueryModel、QSqlTable和QSqlRelationalTableModel。
此三类都继承自QAbstractableModel 派生来的。
使用这些类的好处是很容易地适应其他数据源。
1、SQL查询模型
QSqlQueryModel 提供了一个基于SQL查询的只读模型。
QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery("select * from student");
model->setHeaderData(0, Qt::Horizontal, tr("学号"));
model->setHeaderData(1, Qt::Horizontal, tr("姓名"));
model->setHeaderData(2, Qt::Horizontal, tr("课程"));
QTableView *view = new QTableView(this);
view->setModel(model);
这里首先创建了QSqlQueryModel 对象,然后使用setQuery()来执行SQL语句进行查询整张student表。使用setHeaderData()来设置显示的表头。
然后创建视图,将QSqlModel对象作为其要显示的模型。
QSqlQueryModel中的其他操作:
colunmnCount() 返回一条记录中字段的个数;
rowCount()返回结果集中记录的条数;
record() 返回第n条记录;
index()返回指定记录指定字段的索引;
clear()可以清空模型中的结果集。
query()获取QSqlQuery对象。
2、SQL表格模型
QSqlTableModel提供了一个一次只能操作一个SQL 表的读、写模型。
它是QSqlQuery的更高层次的替代品,可以浏览和修改独立的SQL表。
如果想让其成为只读模型,那么可以从视图进行设置,例如
view->setEditTrigers(QAbstractItemView::NoEditTriggers);
代码示例:
model = new QSqlTableModel(this);
model->setTable("student"); //指定数据表
model->select(); //查询等价于“select * from student”
// 设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit); // 设置表格模型的编辑策略
ui->tableView->setModel(model);
// 提交修改按钮
void MainWindow::on_pushButton_clicked()
{
// 开始事务操作
model->database().transaction();
if (model->submitAll()) {
model->database().commit(); //提交
} else {
model->database().rollback(); //回滚
QMessageBox::warning(this, tr("tableModel"),
tr("数据库错误: %1").arg(model->lastError().text()));
}
}
// 撤销修改按钮
void MainWindow::on_pushButton_2_clicked()
{
model->revertAll(); //将模型中的修改进行恢复
}
// 查询按钮,进行筛选
void MainWindow::on_pushButton_7_clicked()
{
QString name = ui->lineEdit->text();
//根据姓名进行筛选,一定要使用单引号
model->setFilter(QString("name = '%1'").arg(name));
model->select();
}
// 显示全表按钮
void MainWindow::on_pushButton_8_clicked()
{
model->setTable("student");
model->select();
}
// 按id升序排列按钮
void MainWindow::on_pushButton_5_clicked()
{
//id属性,即第0列,升序排列
model->setSort(0, Qt::AscendingOrder);
model->select();
}
// 按id降序排列按钮
void MainWindow::on_pushButton_6_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
}
// 删除选中行按钮
void MainWindow::on_pushButton_4_clicked()
{
// 获取选中的行
int curRow = ui->tableView->currentIndex().row();
// 删除该行
model->removeRow(curRow);
int ok = QMessageBox::warning(this,tr("删除当前行!"),
tr("你确定删除当前行吗?"),QMessageBox::Yes, QMessageBox::No);
if(ok == QMessageBox::No)
{ // 如果不删除,则撤销
model->revertAll();
} else { // 否则提交,在数据库中删除该行
model->submitAll();
}
}
// 添加记录按钮
void MainWindow::on_pushButton_3_clicked()
{
// 获得表的行数
int rowNum = model->rowCount();
int id = 10;
// 添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0), id);
// 可以直接提交
//model->submitAll();
}
3、关系表格模型
QSqlRelationTableModel继承自QSqlTableModel,且对其进行了扩展,提供了对外键的支持。
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
model->setTable("student");
model->setRelation(2, QSqlRelation("course", "id", "name"));//在两表之间创建一个关系,参数“2“表示student表中的编号为2的列,即第三个字段course
是一个外键,它映射到了course 表中的id字段
model->select();
QTableView *view = new QTableView(this);
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view)); // 设置委托
}
总结:
-
可以根据实际的需要选择哪个模型。如果熟悉SQL语法,又不需要将所有的数据都显示出来,只需要使用QSqlQuery就可以了。
-
QSqlTableModel,主要是用来显示一个单独的表格的。
-
QSqlQueryModel,可以显示任意一个结果集。
-
关于 数据库部分的应用,可以参考SQL分类下的几个示例程序。
本文档整理自《QtCreator快速入门》