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 为其他表的外键字段提供了一个下拉框。