在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelationalTable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,名称)就是用来实现多表之间快速关联的。

首先我们创建两张表,一张Student表存储学生名字以及学生课程号,另一张Departments存储每个编号所对应的系所名称,运行代码完成创建。

void MainWindow::InitSQL()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
return; // 执行SQL创建表
db.exec("DROP TABLE Student");
db.exec("CREATE TABLE Student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
"departID INTEGER NOT NULL)"
); // 逐条插入数据
db.exec("INSERT INTO Student(name,departID) VALUES('zhangsan',10)");
db.exec("INSERT INTO Student(name,departID) VALUES('lisi',20)");
db.exec("INSERT INTO Student(name,departID) VALUES('wangwu',30)");
db.exec("INSERT INTO Student(name,departID) VALUES('wangmazi',40)"); db.exec("DROP TABLE Departments");
db.exec("CREATE TABLE Departments("
"departID INTEGER NOT NULL,"
"department VARCHAR(40) NOT NULL)"
); db.exec("INSERT INTO Departments(departID,department) VALUES (10,'数学学院')");
db.exec("INSERT INTO Departments(departID,department) VALUES (20,'物理学院')");
db.exec("INSERT INTO Departments(departID,department) VALUES (30,'计算机学院')"); db.commit();
db.close();
}

初始化后将得到两张数据表,这两张表通过departID相关联,如下:

创建完成后,我们在程序的构造函数直接实现绑定即可,这段代码很简单如下:

// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitSQL(); // 打开数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
return; this->setCentralWidget(ui->tableView);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setAlternatingRowColors(true); // 打开数据表
tabModel=new QSqlRelationalTableModel(this,DB);
tabModel->setTable("Student"); // 设置数据表
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit); // OnManualSubmit
tabModel->setSort(0,Qt::AscendingOrder); tabModel->setHeaderData(0,Qt::Horizontal,"学号");
tabModel->setHeaderData(1,Qt::Horizontal,"姓名");
tabModel->setHeaderData(2,Qt::Horizontal,"学院"); // 设置代码字段的查询关系数据表
// 打开Departments表,关联ID和department
tabModel->setRelation(2,QSqlRelation("Departments","departID","department"));
theSelection=new QItemSelectionModel(tabModel); ui->tableView->setModel(tabModel);
ui->tableView->setSelectionModel(theSelection);
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView)); // 为关系型字段设置缺省代理组件 tabModel->select(); // 打开数据表
} MainWindow::~MainWindow()
{
delete ui;
}

最终绑定效果如下图:

最新文章

  1. 关于settimeout 和for循环
  2. 生成Kindle可读的mobi和PDF电子书
  3. ZOJ Problem Set - 1292 Integer Inquiry
  4. python 实现文件下载
  5. lr中定义字符串变量
  6. http://www.blogjava.net/xylz/archive/2013/08/05/402405.html
  7. [改善Java代码]对字符串排序 持一种宽容的心态
  8. 解读四大移动web应用开发框架真相
  9. 使用JUnit测试java代码
  10. Pots
  11. UVa11555 - Aspen Avenue
  12. mac使用小提示
  13. CountDownLatch的实现原理
  14. (25)Django中操作cookie与session组件(添加cookie和删除cookie)
  15. 【JEECG技术文档】Online唯一校验使用说明
  16. maven打包某个分支的包
  17. 20145326 《Java程序设计》第4周学习总结
  18. 【SSH网上商城项目实战17】购物车基本功能的实现
  19. Python中的range和xrange区别
  20. Android JUnit test

热门文章

  1. 设计模式学习-使用go实现享元模式
  2. python实现直方图的应用
  3. Financial Tsunami
  4. [atAGC004F]Namori
  5. [loj3032]馕
  6. Git操作: git commit代码后,如何撤回且保留commit的代码
  7. 面试官又整新活,居然问我for循环用i++和++i哪个效率高?
  8. 『与善仁』Appium基础 — 12、Appium的安装详解
  9. dlang 安装
  10. vim ——批量注释