QSqlRelationalTableModel关系表模型示例
- 示例用到三个表:
雇员employee,存储雇员的信息,包括雇员id、姓名、城市id、国籍id;
城市表city,存储城市id,城市名称;
国家表country,存储国家id、国家名称 - 雇员表的城市id是city表的外键:
model->setRelation(2, QSqlRelation("city", "id", "name"));
model填充的是employee表数据,2表示employee的第2列(即城市id,city表的外键),“city”表示数据库的city表,“id”表示对应的主键,“name”表示要select的字段; - 雇员表的国籍id是country表的外键:
model->setRelation(3, QSqlRelation("country", "id", "name"));
2、3两条语句执行完相当于下面SQL select语句:
SELECT e.id,e.name,ci.name,co.name
FROM employee e
INNER JOIN city ci
ON e.city = c.id;
INNER JOIN country co
ON e.country= co.id;
-
关于
std::unique_ptr<QTableView> view(new QTableView());
的用法,请参考 -
视图使用默认委托
view->setItemDelegate(new QSqlRelationalDelegate(view.get()));
,双击City列或者Country列,单元项会自动变成QComboBox小部件,供用户选择
示例界面
- 第1、2列分别显示雇员表employee的雇员id、姓名;第三列显示City表的name字段;第四列显示country表的name字段
示例代码
- 新建Qt项目,名称:relationalTableModel。
- 双击mainwindow.ui,拖一个QPushButton到窗口上
- 右击窗体空白处,选择【布局】,【栅格布局】
- 结果如下
- 双击relationaltablemodel.pro,增加下列模块
QT += sql widgets
- 完整的relationaltablemodel.pro文件代码如下,大部份都是ide自动生成的
QT += core gui sql widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
../connection.h \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${
TARGET}/bin
else: unix:!android: target.path = /opt/$${
TARGET}/bin
!isEmpty(target.path): INSTALLS += target
- 数据库头文件connection.h,主要完成默认数据库的创建(后面实例表model对象会用到,默认调用此数据库),以及为数据库建三个表,每个表插入若干条记录,在本例中,这个三个表没有用,我们在mainwindow.cpp中又建了三个表来演示
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery><