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 <QtWidgets>
#include <QtSql>

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

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

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

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


QSqlRelationalDelegate

一、描述

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

Qt中,可以使用`QSqlDatabase`类连接和操作数据库,同时还提供了一些其他的数据库类,如`QSqlQuery`、`QSqlTableModel`、`QSqlRelationalTableModel`等,用于执行SQL查询、管理数据表、设置关系等操作。下面以MySQL数据库为例,介绍一些常用的数据库类的使用方法。 1. 连接数据库 使用`QSqlDatabase`类连接数据库,可以参考前面的回答。连接成功后,可以使用`QSqlQuery`类执行SQL查询语句。 2. 执行SQL查询 使用`QSqlQuery`类可以执行SQL查询语句,例如: ``` QSqlQuery query; query.exec("SELECT * FROM myTable"); while (query.next()) { // 处理查询结果 } ``` 这里执行了一个简单的查询语句,返回`myTable`表中的所有数据,并使用`while`循环遍历查询结果。在`while`循环中,可以使用`query.value()`函数获取指定列的值。 3. 插入数据 使用`QSqlQuery`类可以执行SQL插入语句,例如: ``` QSqlQuery query; query.prepare("INSERT INTO myTable (name, age) VALUES (:name, :age)"); query.bindValue(":name", "Tom"); query.bindValue(":age", 20); query.exec(); ``` 这里执行了一个简单的插入语句,将一个名为`Tom`,年龄为`20`的记录插入到`myTable`表中。 4. 更新数据 使用`QSqlQuery`类可以执行SQL更新语句,例如: ``` QSqlQuery query; query.prepare("UPDATE myTable SET age=:age WHERE name=:name"); query.bindValue(":age", 25); query.bindValue(":name", "Tom"); query.exec(); ``` 这里执行了一个简单的更新语句,将`myTable`表中名为`Tom`的记录的年龄更新为`25`。 5. 删除数据 使用`QSqlQuery`类可以执行SQL删除语句,例如: ``` QSqlQuery query; query.prepare("DELETE FROM myTable WHERE name=:name"); query.bindValue(":name", "Tom"); query.exec(); ``` 这里执行了一个简单的删除语句,将`myTable`表中名为`Tom`的记录删除。 6. 使用模型类管理数据表 在Qt中,使用`QSqlTableModel`类可以管理数据表,例如: ``` QSqlTableModel model; model.setTable("myTable"); model.setFilter("name='Tom'"); model.select(); ``` 这里创建了一个`QSqlTableModel`对象`model`,并设置其操作的数据表名为`myTable`,筛选条件为名字为`Tom`的记录。最后,调用`select()`函数执行查询操作。 7. 设置数据表关系 在Qt中,使用`QSqlRelationalTableModel`类可以设置数据表之间的关系,例如: ``` QSqlRelationalTableModel model; model.setTable("myTable"); model.setRelation(1, QSqlRelation("myTable2", "id", "name")); model.select(); ``` 这里设置了`myTable`表和`myTable2`表之间的关系,将`myTable`表的第二列(即`id`列)与`myTable2`表的`id`列关联起来,并在`myTable`表中显示`myTable2`表中`name`列的值。最后,调用`select()`函数执行查询操作。 以上是一些常用的数据库类的使用方法,需要根据实际需求进行具体的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值