先创建了QSqlQueryModel对象,然后使用setQuery()来执行SQL语句查询整张student表,并使用setHeaderData()来设置显示的标头。后面创建了视图,并将QSqlQueryModel对象作为其要显示的模型。这里要注意,其实QSqlQueryModel中存储的是执行完setQuery()函数后的结果集,所以视图中显示的是结果集的内容。QSqlQueryModel中还提供了columnCount()返回一条记录中字段的个数;rowCount()返回结果集中记录的条数;record()返回第n条记录;index()返回指定记录的指定字段的索引;clear()可以清空模型中的结果集。
2.QSqlTableModel模型
QSqlTableModel提供了一个一次只能操作一个SQL表的读写模型,它是QSqlQuery的更高层次的替代品,可以浏览和修改独立的SQL表,并且只需编写很少的代码,而且不需要了解SQL语法。
创建数据表
QSqlQuery query; // 创建student表 query.exec("create table student (id int primary key, " "name varchar, course int)"); query.exec("insert into student values(1, '李', 10)"); query.exec("insert into student values(2, '马', 11)"); query.exec("insert into student values(3, '孙', 12)"); // 创建course表 query.exec("create table course (id int primary key, " "name varchar, teacher varchar)"); query.exec("insert into course values(10, '数学', '王老师')"); query.exec("insert into course values(11, '英语', '张老师')"); query.exec("insert into course values(12, '计算机', '李老师')");
显示表:
QSqlTableModel *model = new QSqlTableModel(this); model->setTable("student"); model->select(); // 设置编辑策略 model->setEditStrategy(QSqlTableModel::OnManualSubmit); ui->tableView->setModel(model); ui->tableView->verticalHeader()->setHidden(true); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
创建一个QSqlTableModel后,只需使用setTable()来为其指定数据库表,然后使用select()函数进行查询,调用这两个函数就等价于执行了“select * from student”语句。这里还可以使用setFilter()来指定查询时的条件。在使用该模型以前,一般还要设置其编辑策略,它由QSqlTableModel::EditStrategy枚举类型定义。
常量 | 描述 |
---|---|
QSqlTableModel::OnFieldChange | 所有对模型的改变都会立即应用到数据库 |
QSqlTableModel::OnRowChange | 对一条记录的改变会在用户选择另一条记录时被应用 |
QSqlTableModel::OnManualSubmit | 所有的改变都会在模型中进行缓存,直到调用submitAll()或者reverAll()函数 |
修改
// 开始事务操作 model->database().transaction(); if (model->submitAll()) { if(model->database().commit()) // 提交 QMessageBox::information(this, tr("tableModel"),tr("数据修改成功!")); } else { model->database().rollback(); // 回滚 QMessageBox::warning(this, tr("tableModel"),tr("数据库错误: %1").arg(model->lastError().text()),QMessageBox::Ok); }
撤销修
model->revertAll();
查询
//全部数据 model->setTable("student"); model->select(); //进行筛选 QString name = "xxx" ; // 根据姓名进行筛选,一定要使用单引号 model->setFilter(QString("name = '%1'").arg(name)); model->select();
升序
//id字段,即第0列,升序排列 model->setSort(0, Qt::AscendingOrder); model->select();
删除
// 获取选中的行 int curRow = ui->tableView->currentIndex().row(); // 删除该行 model->removeRow(curRow); int ok1 = QMessageBox::warning(this,tr("删除当前行!"), tr("你确定删除当前行吗?"), QMessageBox::Yes, QMessageBox::No); if(ok == QMessageBox::No) { // 如果不删除,则撤销 model->revertAll(); } else { // 否则提交,在数据库中删除该行 model->submitAll(); }
3.QSqlRelationalTableModel模型
QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个字段和其他表中的主键字段之间的一对一的映射。例如,student表中的course字段对应的是course表中的id字段,那么就称字段course是一个外键。因为这里的course字段的值是一些数字,这样的显示很不友好,使用关系表格模型,就可以将它显示为course表中的name字段的值。
QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this); model->setTable("student"); model->setRelation(2, QSqlRelation("course", "id", "name")); model->select(); ui->tableView->setModel(model); ui->tableView->verticalHeader()->setHidden(true); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
Qt中还提供了一个QSqlRelationalDelegate委托类,它可以为QSqlRelationalTableModel显示和编辑数据。这个委托为一个外键提供了一个QComboBox部件来显示所有可选的数据,这样就显得更加清晰了。
view->setItemDelegate(new QSqlRelationalDelegate(view));
总结
到此这篇关于Qt入门学习之数据库操作指南的文章就介绍到这了,更多相关Qt数据库操作内容请搜索
标签:SQLite
相关阅读 >>
android开发实现读取assets目录下db文件的方法示例
php登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
cc++qt数据库sqlrelationaltable关联表详解
android开发实现的导出数据库到excel表格功能【附源码下载】
分享php代码将360浏览器导出的favdb的Sqlite数据库文件转换为html
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。