QSqlRelationalTableModel,该类为单张的数据库表提供了一个可编辑的数据模型,它支持外键。
我们还是新建Qt4 Gui Application工程,我这里工程名为relationalTableModel ,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:
#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if(!db.open()) return false;
QSqlQuery query;
query.exec("create table student (id int primary key, name vchar,course int)");
query.exec("insert into student values (1,'yafei0',1)");
query.exec("insert into student values (2,'yafei1',1)");
query.exec("insert into student values (3,'yafei2',2)");
query.exec("create table course (id int primary key, name vchar, teacher vchar)");
query.exec("insert into course values (1,'Math','yafeilinux1')");
query.exec("insert into course values (2,'English','yafeilinux2')");
query.exec("insert into course values (3,'Computer','yafeilinux3')");
return true;
}
#endif // DATABASE_H
我们在这里建立了两个表,student表中有一项是course,它是int型的,而course表的主键也是int型的。如果要将course项和course表进行关联,它们的类型就必须相同,一定要注意这一点。
然后将main.cpp中的内容更改如下:
#include <QtGui/QApplication>
#include "widget.h"
#include "database.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!createConnection()) return 1;
Widget w;
w.show();
return a.exec();
}
我们在widget.h中添加头文件: #include <QSqlRelationalTableModel>
然后在private中声明对象: QSqlRelationalTableModel *model;
我们在widget.ui中添加一个Table View部件到窗体上,然后到widget.cpp中的构造函数里添加如下代码:
model = new QSqlRelationalTableModel(this);
model->setEditStrategy(QSqlTableModel::OnFieldChange); //属性变化时写入数据库
model->setTable("student");
model->setRelation(2,QSqlRelation("course","id","name"));
//将student表的第三个属性设为course表的id属性的外键,并将其显示为course表的name属性的值
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Course"));
model->select();
ui->tableView->setModel(model);
我们修改了model的提交策略,OnFieldChange表示只要属性被改动就马上写入数据库,这样就不需要我们再执行提交函数了。setRelation()函数实现了创建外键,注意它的格式就行了。
运行效果如下:
可以看到Course属性已经不再是编号,而是具体的课程了。关于外键,你也应该有一定的认识了吧,说简单点就是将两个相关的表建立一个桥梁,让它们关联起来。
那么我们也希望,如果用户更改课程属性,那么他只能在课程表中有的课程中进行选择,而不能随意填写课程。在Qt中的QSqlRelationalDelegate委托类就能实现这个功能。我们只需在上面的构造函数的最后添加一行代码:
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));
添加代理(委托),在我这里不知为什么会出现SqlRelationalDelegate is not a type name的提示,不过可以编译通过。
我们需要在widget.cpp中添加头文件: #include <QSqlRelationalDelegate>
运行效果如下:
可以看到这时修改Course属性时,就会出现一个下拉框,只能选择course表中的几个值。
而利用这个类来操作数据库,与前面讲到的QSqlTableModel没有区别,这里就不再重复。这几篇文章一共讲了好几种操作数据库的方法,到底应该使用哪个呢?那就看你的需求了,根据这几种方法的特点进行选择吧。
分享到:
相关推荐
【Qt】数据库实战之QSqlRelationalTableModel是一个关于使用Qt框架进行数据库操作的教程资源,主要聚焦于QSqlRelationalTableModel类。QSqlRelationalTableModel是Qt库中的一个强大工具,它允许用户在Qt的QTableView...
7. **27-Qt数据库(七)QSqlRelationalTableModel.doc**: 这部分涉及到了QSqlRelationalTableModel,它扩展了QSqlTableModel,支持多对一和一对多的表关系。文档会讲解如何处理数据库表之间的关联,以及如何在视图中...
1. **Qt数据库模块**:Qt数据库模块(QtSql)是Qt框架的一部分,它允许开发者轻松地与多种关系型数据库管理系统(RDBMS)如SQLite、MySQL、PostgreSQL等进行交互。QtSql提供了一组数据库驱动,用于建立和管理数据库...
在QT中连接数据库,主要是通过QSqlDatabase模块来实现的,该模块支持多种数据库系统,包括MySQL、SQLite、PostgreSQL等。 配置QT连接数据库的过程涉及以下几个关键步骤: 1. **添加数据库驱动**: 在QT中,每个...
【Qt--master_QT_Qt数据库】项目是一个利用Qt框架和SQLite数据库开发的嵌入式学生管理系统。在本文中,我们将深入探讨Qt框架的核心概念、SQLite数据库的特点以及如何在Qt中与SQLite集成,以实现一个高效的学生管理...
- **Qt数据库模块**:Qt提供了一套完整的API来处理数据库操作,其中包括QSqlDatabase类用于管理数据库连接,QSqlQuery类用于执行SQL查询,QSqlTableModel/QSqlQueryModel/QSqlRelationalTableModel类用于处理数据...
4. **数据模型**:QT5的QTableView、QListView和QTableView等部件可以与QSqlQueryModel、QSqlRelationalTableModel等模型类结合,直接展示数据库中的数据。这使得数据库内容能够实时反映在界面上。 5. **事务处理**...
QT数据库入门学习主要涵盖的是如何在QT环境中与各种数据库进行交互,这是一项对于软件开发者,尤其是使用QT作为开发工具的程序员来说至关重要的技能。QT是一个跨平台的C++库,它提供了丰富的功能,包括图形用户界面...
在Qt框架中,数据库操作可以通过`QSqlQueryModel`类实现,它提供了一个用于展示SQL查询结果的只读数据模型。`QSqlQueryModel`简化了与数据库的交互,使得开发者无需直接编写SQL语句即可处理数据。在本例中,我们将...
同时,`QSqlTableModel`或`QSqlRelationalTableModel`可用于与Qt的模型视图架构集成,方便数据的显示和编辑。 此外,对于自动化测试,可以使用Qt Test框架编写单元测试,确保数据库操作的正确性。测试用例可以覆盖...
在本主题“四、QT实现图形界面对数据库的操作”中,我们将深入探讨如何利用QT5来设计和实现与数据库交互的图形用户界面(GUI)应用。 首先,QT5提供了一个强大的数据库模块,称为QSql。这个模块允许开发者连接到...
开发者可以使用QtSql来创建数据库连接、执行SQL查询、操作表和记录,实现了数据库的CRUD(创建、读取、更新、删除)操作。 项目中的主要知识点可能包括: 1. **QT框架基础**:理解QT的事件驱动模型,学习如何创建...
#### Qt数据库编程框架 Qt4为数据库访问提供了Qt SQL模块,旨在实现数据库与Qt应用程序之间的无缝集成。Qt SQL模块设计为三层次结构: 1. **驱动层**:这一层负责实现数据库与SQL接口的底层桥接,包括QSqlDriver、...
总的来说,`QSqlRelationalTableModel`是Qt数据库编程中不可或缺的一部分,它简化了数据库数据的展示和操作,使得开发高效、用户友好的数据库应用变得轻而易举。正确理解和熟练运用`QSqlRelationalTableModel`,能够...
在提供的压缩包文件`qt_csdn_9`中,可能包含了关于这些类的示例代码、教程或者相关讨论,你可以进一步学习和研究,加深对Qt数据库接口的理解和应用。记得实践是检验理论的最好方式,尝试编写实际的项目,将理论知识...
- **QSqlQueryModel/QSqlTableModel/QSqlRelationalTableModel**:这些模型用于在Qt应用程序中处理数据库查询结果。 ##### 6. 其他功能 - **XML处理**:介绍如何在Qt中解析和操作XML文件。 - **Qt Quick/QML**:...
4. **数据绑定**:QSqlQueryModel或QSqlRelationalTableModel用于将数据库查询结果展示在表格视图中。这样,用户可以直观地查看、编辑和管理学生信息。 5. **业务逻辑**:编写C++代码来实现具体的业务功能,如添加...
在Qt框架中,QSqlRelationalTableModel是一种强大的数据模型,用于处理关系数据库的数据。这个模型是QAbstractItemModel的一个子类,它与SQL数据库紧密集成,可以方便地展示和编辑数据库表格中的数据,并且支持外键...
【QT5.9.4与QSQLite数据库小程序详解】 QT5.9.4是一个流行的开源跨平台应用程序开发框架,由Qt公司开发,支持多种操作系统,包括Windows、Linux、macOS等。它提供了丰富的库和工具,使开发者能够用C++进行图形用户...
在本项目中,学生管理系统可能是通过QSqlQuery、QSqlTableModel或QSqlRelationalTableModel等类来实现对数据库的读写操作。 【学生管理系统的构建】 一个基于QT的学生管理系统通常包含以下几个主要组件: 1. 数据...