第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章。
我为家乡代言,中国酒都宿迁双沟一枝一叶总关情,情到深处忆家乡。故乡,装载着我们的梦。我来自江苏苏北的一个小镇,它叫做双沟镇。提及它,想必大家脑海中立刻就会想起双沟大曲酒来,不错它就是中国白酒之都宿迁双沟。下面跟
这是一个宝妈成功逆袭,励志故事头条创作挑战赛这位宝妈叫做张梅,她曾经是一名普通的家庭主妇,照顾家庭和孩子是她最主要的职责。然而,在她的生活中,突然发生了一些意外的事情。她的丈夫因为工作的原因常年在外,突发意外不
羊奶粉和牛奶粉有什么区别?说到奶粉,我们先想到的无非就是羊奶粉和牛奶粉两种,但你知道羊奶粉和牛奶粉有什么区别吗?这两种奶粉我们该怎么选呢?今天湖湘生活百科就给大家分享一下羊奶粉和牛奶粉有什么区别!奶粉好不好
宝宝反复湿疹,教你3步就解决大家好,我是药师皓月,很高兴又见面了。2岁到5岁之间的宝宝,身上脸上总是反反复复地出现湿疹,表现出皮肤特别干燥,还很痒,晚上经常哭闹,严重影响到了家长和孩子的睡眠及身心健康。如果你
市机幼乐艺园多一个小小的举动,让垃圾变废为宝来源乐山市教育局学校传真培根曾说习惯真是一种顽强而巨大的力量,它可以主宰人生,因此人自幼就应该通过完美的教育去建立一种好的习惯。为落实环保从娃娃抓起,从身边做起的环保生活理念,让幼
Meta再裁10000人!先裁技术岗,对华人员工影响大,小扎小作文拿扁平化当裁员借口大数据文摘授权转载自AI前线整理冬梅Tina当地时间3月14日,Meta正式宣布公司计划在未来几个月内裁员1万人,并关闭约5000个尚未聘用的空缺职位。此次裁员,已经是继去年11月
宝地矿业(601121)储量品质占据领先盈利能力稳健增长新疆宝地矿业股份有限公司(以下简称宝地矿业)于3月10日正式登陆沪市主板。公开资料显示,宝地矿业成立于2001年,主营业务为铁矿石的开采选矿加工和铁精粉销售,其中铁精粉为公司主要产
荣膺2023质量诚信承诺案例企业源氏木语走高质量发展之路中国质量新闻网讯2月以来,中国质量新闻网家居频道以提振市场消费信心彰显品质消费榜样为主题,开展2023质量诚信承诺案例企业征集活动,旨在将家居产业高品质强服务的品牌带入更多人的视野
2023泰国可再生能源峰会举行来源人民网国际频道原创稿2023泰国可再生能源峰会现场。人民网李源欣摄2023泰国可再生能源峰会现场。人民网李源欣摄泰国能源部替代能源开发与效率局局长普拉斯特在峰会上致辞。人民网景
镇街工改速递东凤镇民乐社区和合工业园连片改造项目。李姗恒摄去年,翠亨新区正式启动南朗工业区1142亩低效工业用地的升级改造工作。南方日报记者叶志文摄加持制造业发展,中山一方面掀起商住改工潮,一
取消户籍限制,贷款提取全市通办哈市这部分人员可自主建户缴存公积金17日,记者从哈尔滨住房公积金管理中心获悉,为方便高层次人才和劳动力在哈落户创业,降低职工在我市同城转移接续门槛,为新市民青年人农业转移人口提供住房保障,从即日起,我市进一步优化个
卡塔尔世界杯中国元素如满天繁星11月17日,来自中国的两只大熊猫京京和四海在卡塔尔首都多哈的豪尔熊猫馆正式与公众见面。图为大熊猫四海。新华社记者肖艺九摄2022年卡塔尔世界杯开幕前,义乌国际商贸城旗帜足球球衣等
世界杯一天四赛,看点十足,三大巨星闪耀,今夜注定不眠今夜的世界杯将进行四场比赛,18点瑞士对阵喀麦隆,21点乌拉圭对阵韩国,0点葡萄牙对阵加纳,3点巴西对阵塞尔维亚,这四场比赛都是本届世界杯不容错过的重要比赛。首先,瑞士对阵喀麦隆。
卡塔尔世界杯喀麦隆队主帅我们也将震惊世界新华社多哈11月23日电(记者刘扬涛岳冉冉)23日,在喀麦隆队与瑞士队的卡塔尔世界杯小组赛赛前新闻发布会上,喀麦隆队主帅里格贝特宋说我相信我们将成为下一支震惊世界的球队。图源国际足
海信,在世界杯打擦边球?海信在世界杯赛场中国第一,世界第二的广告,是在擦中国广告法的边。文丨BT财经无忌电影霍元甲中有一句台词霍元甲,你嘛时候成为津门第一?,这句台词已经变为拷问海信的网络热梗海信,嘛时候
卡塔尔世界有感,中国不申办世界杯的理由是什么很多人有疑惑,作为世界三大赛事之一的世界杯,中国为什么不申办?有人说是因为世界杯对场地的要求高,国内符合要求的场馆少,如果申办需要大量投资,经济上不值。有人说不为别的,就国足那两把
天舟快递又快又准(筑梦太空之家中国空间站建设记)来源人民日报海外版新华社发11月21日,在甘肃酒泉卫星发射中心,神舟十五号载人飞船与长征二号F遥十五运载火箭组合体转运至发射区。神舟十五号计划近日择机实施发射,将3名中国航天员送入
因天气不佳NASA的SpaceXCRS26商业补给任务被取消由于佛罗里达州太空海岸一带的天气状况不佳,SpaceX公司计划在今天向国际空间站发射第26次商业补给服务任务(CRS26)被取消,SpaceX公司和美国国家航空航天局设定的下一个目
古今中外祛痘方法大盘点,原来慈禧也祛痘你有没有好奇过古代人会长痘痘吗?会战国时期庄子里有个曹商舐痔的故事庄子拿破痈溃痤者,得车一乘。舐痔者,得车五乘来讽刺曹商丧失尊严来换取财富这里的痤,就是痤疮的意思东汉时期说文解字曰
古驰创意总监将卸任(知消2022年11月24日讯)AlessandroMichele将卸任意大利奢侈品牌古驰(Gucci)的创意总监一职,他自2015年1月21日起就担任创意总监,古怪设计曾为古驰注
澳门往事之虚幻的假象头条创作挑战赛人生亦如梦,如梦幻泡影。沉沉的梦中,我来到了悬崖边缘,束手无策。仰望天空,看见了光明天使,她扇动着翅膀朝我召唤俯首深渊,却惊动了黑暗魔鬼,它挥舞起魔爪向我扑来。我,心
最好的养生方法寡言寡视寡欲01hr古人说少则得,多则惑。当你什么都想得到的时候,就会一无所获。放开多余的东西,才能拥抱想要的东西。一路走来,能够活得轻松的人,都是边走边扔的人。曾国藩,从小用功读书,然后走进