QSqlRelation 类存储有关 SQL 外键的信息,是 QSqlRelationalTableModel 的辅助类。
1、QString displayColumn()
从表 tableName() 返回应该呈现给用户的列,而不是外键。
2、QString indexColumn()
从表 tableName() 返回外键引用的索引列。
3、bool isValid()
QSqlRelation 对象是否有效。
4、QString tableName()
外键引用的表的名称。
QSqlRelationalTableModel 类继承自 QSqlTableModel,为单个数据库表提供可编辑的数据模型,并允许将列设置为其他数据库表的外键。
- #include
- #include
-
- static bool createConnection()
- {
- QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
- db.setDatabaseName(":memory:");
- if (!db.open())
- {
- return false;
- }
-
- QSqlQuery query;
- query.exec("create table employee(id int primary key, 姓名 varchar(20), 城市 int, 国家 int)");
- query.exec("insert into employee values(1, '张三', 5000, 47)");
- query.exec("insert into employee values(2, '李四', 80000, 49)");
- query.exec("insert into employee values(3, '王五', 100, 1)");
-
- query.exec("create table city(id int, 城市名称 varchar(20))");
- query.exec("insert into city values(100, '北京')");
- query.exec("insert into city values(5000, '洛杉矶')");
- query.exec("insert into city values(80000, '平壤')");
-
- query.exec("create table country(id int, 国家名称 varchar(20))");
- query.exec("insert into country values(1, '中国')");
- query.exec("insert into country values(47, '美国')");
- query.exec("insert into country values(49, '朝鲜')");
-
- return true;
- }
-
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- if (!createConnection())
- return EXIT_FAILURE;
-
- QSqlRelationalTableModel model;
- model.setTable("employee");
- model.setEditStrategy(QSqlTableModel::OnManualSubmit);
- model.setRelation(2, QSqlRelation("city", "id", "城市名称"));
- model.setRelation(3, QSqlRelation("country", "id", "国家名称"));
- model.setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
- model.setHeaderData(1, Qt::Horizontal, QObject::tr("雇员姓名"));
- model.setHeaderData(2, Qt::Horizontal, QObject::tr("雇员城市"));
- model.setHeaderData(3, Qt::Horizontal, QObject::tr("雇员国家"));
- model.select();
-
- QTableView view;
- view.setModel(&model);
- view.setItemDelegate(new QSqlRelationalDelegate(&view));
- view.setWindowTitle(QObject::tr("employee 表中的内容"));
- view.show();
-
- return app.exec();
- }

1、QSqlRelation relation(int column)
返回列 column 的关系。
2、QSqlTableModel * relationModel(int column)
返回一个 QSqlTableModel 对象,用于访问列是外键的表,如果列 column 没有关系,则返回 nullptr。返回的对象归 QSqlRelationalTableModel 所有。
3、bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
设置 index 的项中角色 role 的数据。根据编辑策略,该值可能会立即应用于数据库,也可能会缓存在模型中。
对于关系列,value 必须是索引,而不是显示值。索引也必须存在于引用的表中,否则函数返回 false。
4、void setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
设置 SQL 连接模式以显示或隐藏具有 NULL 外键的行。
enum QSqlRelationalTableModel::JoinMode


5、void setRelation(int column, const QSqlRelation &relation)
让指定的列 column 是由 relation 指定的外部索引。
QSqlRelationalDelegate 类提供了一个委托,用于显示和编辑来自 QSqlRelationalTableModel 的数据。与默认委托不同,QSqlRelationalDelegate 为其他表的外键字段提供了一个下拉框。