Qt-数据库开发-外键使用(4) 原创
Qt-数据库开发-使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键]
更多精彩内容 |
---|
👉个人内容分类汇总 👈 |
👉数据库开发 👈 |
1、概述
- 这是通过学习Qt官方Demo产生的一个示例;
- 通过自己理解加入了一些更加详细便于学习的内容;
- 添加了非常详细的注释信息,对于小白更加友好。
开发环境说明
- 系统:Windows10、Ubuntu20.04
- Qt版本:V5.12.5
- 编译器:MSVC2017-64、GCC/G++64
2、实现效果
- 本示例展示了如何使用QSqlRelationalTableModel(关系表模型)来可视化数据库中[外键]的使用。
- 程序启动时自动创建一个数据库,并创建一个主表个两个从表,可选择创建文件数据还是内存数据库;
- 通过主表中的【外键】去关联子表中的数据;
- 只有一个main.cpp,十分简单便于学习。
-
实现效果如下:
3、主要代码
-
啥也不说了,直接上代码,一切有注释
-
pro文件: Qt使用到数据库,上来什么都别管,先在pro文件添加上
QT += sql widgets
; -
main.cpp文件:程序第一次启动时在main函数中创建数据库并写入数据,并通过QTableView显示数据库内容;
#include <QApplication> #include <QSqlRelationalDelegate> #include <QSqlRelationalTableModel> #include <qmessagebox.h> #include <qsqldatabase.h> #include <qsqlquery.h> #include <qtableview.h> /** * @brief 创建并打开一个QSqlite数据库,并创建一个主表、两个从表 * @return */ bool createConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // 使用数据库驱动(Qsqlite)和默认连接名称(qt_sql_default_connection)添加一个数据库 // qDebug() << QSqlDatabase::defaultConnection; // 打印默认数据库连接名称 #if 1 db.setDatabaseName("test.db"); // 使用文件数据库(可生成数据库文件,数据一直有效) #else db.setDatabaseName(":memory:"); // 使用内存数据库(不会生成数据库文件,所有数据都在内存中进行操作,性能强,程序退出后数据丢失) #endif if(!db.open()) // 打开数据库 { QMessageBox::critical(nullptr, "Error", "打开数据库失败!"); return false; } QSqlQuery query; // 创建一个用于执行和操作Sql语句的对象 // 创建一个主表person,包含id、name、grade、class四个字段 query.exec("create table student (" "id int primary key," // 索引 "name varchar(20)," // 姓名 "grade int," // 年级 "class int )"); // 班级 query.exec("insert into student values(1, '大毛', 3, 2)"); // 插入学生数据(大毛、三年级2班) query.exec("insert into student values(2, '二毛', 3, 1)"); query.exec("insert into student values(3, '三毛', 2, 3)"); query.exec("insert into student values(4, '小毛', 1, 4)"); query.exec("create table grade (id int, name varchar(20))"); // 创建年级从表 query.exec("insert into grade values(1, '一年级')"); query.exec("insert into grade values(2, '二年级')"); query.exec("insert into grade values(3, '三年级')"); query.exec("create table class (id int, name varchar(20))"); // 创建班级从表 query.exec("insert into class values(1, '(1)班')"); query.exec("insert into class values(2, '(2)班')"); query.exec("insert into class values(3, '(3)班')"); query.exec("insert into class values(4, '(4)班')"); return true; } /** * @brief 初始化设置model * @param model */ void initModel(QSqlRelationalTableModel* model) { model->setTable("student"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); // 在界面修改后不立即保存到数据库 model->setRelation(2, QSqlRelation("grade", "id", "name")); // 将第2列数据通过外键关联到从表 model->setRelation(3, QSqlRelation("class", "id", "name")); // 设置列标题 model->setHeaderData(0, Qt::Horizontal, "ID"); model->setHeaderData(1, Qt::Horizontal, "姓名"); model->setHeaderData(2, Qt::Horizontal, "年级"); model->setHeaderData(3, Qt::Horizontal, "班级"); model->select(); // 查询数据库数据 } int main(int argc, char *argv[]) { QApplication a(argc, argv); if(!createConnection()) return -1; // 打开数据库并创建一个主表、两个子表 QSqlRelationalTableModel model; // 创建一个支持使用外键的model initModel(&model); QTableView* view = new QTableView; // 创建一个表格视图,用于显示数据库数据 view->resize(500, 300); view->setWindowTitle(QString("QSql-通过QSqlRelationalTableModel类使用外键Demo - V%1").arg(APP_VERSION)); view->setModel(&model); view->setItemDelegate(new QSqlRelationalDelegate(view)); // 与默认委托不同,QSqlRelationalDelegate 为其他表的外键字段提供了一个组合框 view->show(); return a.exec(); }