第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel

导语

QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个属性和其他表中的主键属性之间的一对一的映射。例如,student表中的course属性对应的是course表中的id属性,那么就称属性course是一个外键。因为这里的course属性的值是一些数字,这样的显示很不友好,使用关系表格模型,就可以将它显示为course表中的name属性的值。

环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2

目录

一、使用外键

二、使用委托

正文

一、使用外键

1.新建Qt Gui应用,名称为relationalTableModel,基类为QMainWindow,类名为MainWindow。完成后打开relationalTableModel.pro项目文件,将第一行改为:

QT += coregui sql

然后保存该文件。

2.下面向项目中添加新的C++头文件connection.h,并更改其内容如下:

#ifndef CONNECTION_H

#define CONNECTION_H

#include

#include

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 primarykey, 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 // CONNECTION_H

在这里建立了两个表,student表中有一项是course,它是int型的,而course表的主键也是int型的。如果要将course项和course表进行关联,它们的类型就必须相同,一定要注意这一点。

3.更改main.cpp文件内容如下:

#include "mainwindow.h"

#include

#include "connection.h"

int main(int argc, char *argv[]){

QApplication a(argc, argv);

if(!createConnection()) return 1;

MainWindow w;

w.show();

return a.exec();

}

4.然后到mainwindow.h文件中,先包含头文件:

#include

然后添加private类型对象声明:

QSqlRelationalTableModel *model;

5.到设计模式,往界面上拖放一个Table View部件。

6.到mainwindow.cpp文件中,在构造函数里添加如下代码:

model = new QSqlRelationalTableModel(this);

//属性变化时写入数据库

model->setEditStrategy(QSqlTableModel::OnFieldChange);

model->setTable("student");

//将student表的第三个属性设为course表的id属性的外键,

//并将其显示为course表的name属性的值

model->setRelation(2,QSqlRelation("course","id","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()函数实现了创建外键,注意它的格式就行了。

7.运行程序,效果如下图所示。

可以看到Course属性已经不再是编号,而是具体的课程了。关于外键,大家也应该有一定的认识了吧,说简单点就是将两个相关的表建立一个桥梁,让它们关联起来。

二、使用委托

有时我们也希望,如果用户更改课程属性,那么只能在课程表中有的课程中进行选择,而不能随意填写课程。Qt中还提供了一个QSqlRelationalDelegate委托类,它可以为QSqlRelationalTableModel显示和编辑数据。这个委托为一个外键提供了一个QComboBox部件来显示所有可选的数据,这样就显得更加人性化了。使用这个委托是很简单的,我们先在mainwindow.cpp文件中添加头文件#include ,然后继续在构造函数中添加如下一行代码:

ui->tableView->setItemDelegate(

new QSqlRelationalDelegate(ui->tableView));

运行程序,效果如下图所示。

结语

我们可以根据自己的需要来选择使用哪个模型。如果熟悉SQL语法,又不需要将所有的数据都显示出来,那么只需要使用QSqlQuery就可以了。对于QSqlTableModel,它主要是用来显示一个单独的表格的,而QSqlQueryModel可以用来显示任意一个结果集,如果想显示任意一个结果集,而且想使其可读写,那么建议子类化QSqlQueryModel,然后重新实现flags()和setData()函数。更多相关内容请查看《Qt Creator快速入门》第17章。

qsql 关联_第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel相关推荐

  1. [Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel

    [Qt教程] 第26篇 数据库(六)SQL关系表格模型QSqlRelationalTableModel 楼主  发表于 2013-5-21 20:54:13 | 查看: 677| 回复: 6 SQL关 ...

  2. qsql 关联_(十八)链接数据库,QSqlTableModel

    #include "mysql.h"#include"ui_mysql.h"#include#include#include#include#includeMy ...

  3. qsql 关联_怎样在Qt下连接读写sqlite数据库

    我们接着来写查询按钮的代码,输入以下代码: QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE","rconntos ...

  4. sql截去最后一位_数据技能篇(EXCEL,SQL,Python)

    一.为什么要学习Excel 1.Excel的学习路径: Excel首先是一个好用的工具(不因为你会Python而成为数据分析师,而是能用任何工具来解决问题) 应用场景:Excel,SQL,业务(敏捷, ...

  5. 如何导入超大mysql数据库备份文件_导入超大MySQL数据库备份文件.sql工具-BigDump使用方法...

    有时我们的.sql数据库文件有100M多,有的更大,通过phpmyadmin导入时出错,有时提示:脚本执行超时等,只得寻找别的方法或工具. BigDump 数据库导入工具简介 BigDump 是由德国 ...

  6. 小鱼易连电脑版_生活多么美好 篇十六:我的桌面改造,有绿植,有小鱼,有大音箱...

    原标题:生活多么美好 篇十六:我的桌面改造,有绿植,有小鱼,有大音箱 生活多么美好 篇十六:我的桌面改造,有绿植,有小鱼,有大音箱 2020-11-06 22:13:312点赞1收藏1评论 想攒一台电 ...

  7. insert exec 语句不能嵌套_走向DBA「MSSQL篇」 - 从SQL语句的角度提高数据库的访问性能...

    最近公司来一个非常虎的DBA,10几年的经验,这里就称之为蔡老师吧,在征得我们蔡老同意的前提下 ,我们来分享一下蔡老给我们带来的宝贵财富,欢迎其他的DBA来拍砖. 目录 1.什么是执行计划?执行计划是 ...

  8. python向数据库中添加参数_第四篇:python操作数据库时的传参问题

    python在操作数据库执行sql的时候我们经常会遇到传参问题,以下是我总结的几种方法: 1.格式化字符串 city = 'beijing' cur.execute("SELECT * FR ...

  9. [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel

    [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel 楼主  发表于 2013-5-21 20:36:22 | 查看: 923| 回复: 7 SQL表格模型QSqlTable ...

最新文章

  1. Android 点击空白出隐藏软键盘
  2. CVPR2020 | PV-RCNN: 3D目标检测
  3. 金蝶API apiEnv.apiSession.Token = GetToken()报错
  4. OpenGL Gouraud着色法的实例
  5. JEECG开源社区, 成立了微信二次开发项目,欢迎有兴趣朋友参与
  6. java 从键盘中读取字符流 自定义异常
  7. A^n=E;则(A*)^n=?
  8. 如何以子类的形式运行多进程?
  9. 关于#pragma warning 用法的研究
  10. 烟台市建筑物矢量数据(Shp格式+带高度)
  11. 项目中常用到的正则(价格千位分割格式化,手机号3-4-4格式化,密码验证,去除空格,获取url参数,检测24小时时间制,检测url前缀,检测中文,检测手机号,英文单词前后加空格,判断版本号)
  12. 超强进程结束命令NTSD
  13. 用js转换joson返回数据库的时间格式为/Date(*************)/
  14. 曙光服务器I620-G10安装windows server 2012 教程,附raid卡驱动
  15. 文件不见还占用空间咋修复
  16. uniapp中使用iconfont多色图标
  17. 独立站导航栏装修指南
  18. 怎样防止羊毛党刷补贴?防护软件大火
  19. vue项目实现单/多文件下载和打包压缩下载
  20. 正则表达式(附匹配手机号和HTML标签)

热门文章

  1. TCP/IP illustrated 阅读笔记(三) IP协议
  2. 详细的web开发部署步骤(在新版配置环境下的自我总结)(内附精美五子棋游戏代码)
  3. 国家授时中心的报时为什么用苏宁领券中心的时间接口呢?
  4. 我与大家分享一下手机内存卡照片恢复的相关信息
  5. 【MMPose】在HRNet应用SimDR(SimCC)/Part.1-配置文件篇
  6. 静电不静 · 静电解决方法
  7. medoo连接mysql_PHP数据库框架Medoo1.6安装步骤
  8. c语言程序报告学分信息管理,C语言程序报告学生学籍信息管理系统(总21页
  9. linux主机上,UnixBench性能测试工具使用
  10. 计算机专业c 用到的文献,【计算机专业论文】高校非计算机专业C程序设计的微课教学(共2539字)...