Qt SQL:QSqlRelation、QSqlRelationalTableModel、QSqlRelationalDelegate

QSqlRelation

一、描述

QSqlRelation 类存储有关 SQL 外键的信息,是 QSqlRelationalTableModel 的辅助类。

二、成员函数

1、QString displayColumn()

从表 tableName() 返回应该呈现给用户的列,而不是外键。

2、QString indexColumn()

从表 tableName() 返回外键引用的索引列。

3、bool isValid()

QSqlRelation 对象是否有效。

4、QString tableName()

外键引用的表的名称。


QSqlRelationalTableModel

一、描述

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();
}

Qt SQL:QSqlRelation、QSqlRelationalTableModel、QSqlRelationalDelegate_第1张图片

二、成员函数

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

  • InnerJoin:内连接模式,当两个表中至少有一个匹配时返回行。
  • LeftJoin:左连接模式,返回左表 (table_name1) 中的所有行,即使右表 (table_name2) 中没有匹配项。

Qt SQL:QSqlRelation、QSqlRelationalTableModel、QSqlRelationalDelegate_第2张图片

Qt SQL:QSqlRelation、QSqlRelationalTableModel、QSqlRelationalDelegate_第3张图片

5、void setRelation(int column, const QSqlRelation &relation)

让指定的列 column 是由 relation 指定的外部索引。


QSqlRelationalDelegate

一、描述

QSqlRelationalDelegate 类提供了一个委托,用于显示和编辑来自 QSqlRelationalTableModel 的数据。与默认委托不同,QSqlRelationalDelegate 为其他表的外键字段提供了一个下拉框。

你可能感兴趣的:(#,Qt模型视图框架,Qt,SQL,qt,sql)