Qt数据库操作(三) -- 使用SQL模型类

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快速入门》

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值