《二十七、qt数据库(七)qsqlrelationaltablemodel》由会员分享,可在线阅读,更多相关《二十七、qt数据库(七)qsqlrelationaltablemodel(4页珍藏版)》请在金锄头文库上搜索。
1、讲完 QSqlTableModel 了,我们这次讲这个类的扩展类QSqlRelationalTableModel,它们没有太大的不同,唯一的就是后者在前者的基础之上添加了外键(或者叫外码)的支持。QSqlRelationalTableModel,该类为单张的数据库表提供了一个可编辑的数据模型,它支持外键。我们还是新建 Qt4 Gui Application 工程,我这里工程名为relationalTableModel ,然后选中 QtSql 模块,Base class 选 QWidget。工程建好后,添加 C+ Header File ,命名为 database.h,更改其内容如下:#ifnd
2、ef DATABASE_H#define DATABASE_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(
3、“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.
4、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 #
5、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 然后在 private 中声明对象: QSqlRelationalTableModel *model;我们在 widget.ui 中添加一个 Table View 部件到窗体上,然后到 widget.cpp中的构造函
6、数里添加如下代码: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,
7、 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 属性已
8、经不再是编号,而是具体的课程了。关于外键,你也应该有一定的认识了吧,说简单点就是将两个相关的表建立一个桥梁,让它们关联起来。那么我们也希望,如果用户更改课程属性,那么他只能在课程表中有的课程中进行选择,而不能随意填写课程。在 Qt 中的 QSqlRelationalDelegate 委托类就能实现这个功能。我们只需在上面的构造函数的最后添加一行代码:ui-tableView-setItemDelegate(new QSqlRelationalDelegate(ui-tableView);添加代理(委托),在我这里不知为什么会出现 SqlRelationalDelegate is not a t
9、ype name 的提示,不过可以编译通过。我们需要在 widget.cpp 中添加头文件: #include 运行效果如下:可以看到这时修改 Course 属性时,就会出现一个下拉框,只能选择 course 表中的几个值。而利用这个类来操作数据库,与前面讲到的 QSqlTableModel 没有区别,这里就不再重复。这几篇文章一共讲了好几种操作数据库的方法,到底应该使用哪个呢?那就看你的需求了,根据这几种方法的特点进行选择吧。分类: Qt 系列教程 作者: yafeilinux 日期: 四月 30th, 2010. 244 viewsTags: creator, qt, yafeilinux
10、, 教程, 数据库 2 条评论 在 “二十七、Qt 数据库(七)QSqlRelationalTableModel”1. ding404 说: 2010 年 05 月 26 日于 9:27 上午学习完毕 n(0_0)n, 谢谢楼主。针对 lanyu 的问题,可能是由于你的代码是复制网页上的,这样可能 student name 或者 course name 的单引号格式有问题,需要手动改回来,否则编译能通过,但是运行的时候表格里啥都不显示。我也是找了很久才发现这个问题,编译不会有错的。2. lanyu 说: 2010 年 05 月 17 日于 11:58 下午请问,为什么我的运行结果里显示不出表格里的内容,只有个表格?加入ui-tableView-setItemDelegate(new QSqlRelationalDelegate(ui-tableView);和#include 后,出现error: expected type-specifier before QSqlRelationDelegate谢谢啦!