Класс QSqlRelationalTableModel
Класс QSqlRelationalTableModel предоставляет редактируемую модель данных для отдельной таблицы базы данных с поддержкой внешних ключей. Подробнее...
| Заголовок: | #include <QSqlRelationalTableModel> |
| qmake: | QT += sql |
| Наследует: | QSqlTableModel |
Типы публичного доступа
| перечисление | JoinMode { InnerJoin, LeftJoin } |
Функции публичного доступа
| QSqlRelationalTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase()) | |
| виртуальный | ~QSqlRelationalTableModel() |
| QSqlRelation | relation(int column) const |
| виртуальный QSqlTableModel * | relationModel(int column) const |
| void | setJoinMode(QSqlRelationalTableModel::JoinMode joinMode) |
| виртуальный void | setRelation(int column, const QSqlRelation &relation) |
Переопределённые функции публичного доступа
| виртуальный void | clear() override |
| виртуальный QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const override |
| виртуальный bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
| виртуальный bool | select() override |
| виртуальный bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override |
| виртуальный void | setTable(const QString &table) override |
Свойства публичного доступа
| виртуальный void | revertRow(int row) override |
Переопределённые защищённые функции
| виртуальный bool | insertRowIntoTable(const QSqlRecord &values) override |
| виртуальный QString | orderByClause() const override |
| виртуальный QString | selectStatement() const override |
| виртуальный bool | updateRowInTable(int row, const QSqlRecord &values) override |
Подробное описание
QSqlRelationalTableModel работает как QSqlTableModel, но позволяет устанавливать столбцы в качестве внешних ключей в другие таблицы базы данных.
На левом снимке показан обычный QSqlTableModel в QTableView. Внешние ключи (city и country) не разрешены в удобочитаемые значения. На правом снимке показан QSqlRelationalTableModel, где внешние ключи разрешены в удобочитаемые текстовые строки.
Следующий фрагмент кода демонстрирует, как был настроен QSqlRelationalTableModel:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name")); Функция setRelation() устанавливает связь между двумя таблицами. Первый вызов указывает, что столбец 2 в таблице employee является внешним ключом, который сопоставляется с полем id таблицы city, и что представление должно отобразить пользователю поле city таблицы name. Второй вызов делает нечто подобное со столбцом 3.
Если вы используете QSqlRelationalTableModel для чтения и записи, вам, вероятно, потребуется использовать QSqlRelationalDelegate для представления. В отличие от стандартного делегата, QSqlRelationalDelegate предоставляет раскрывающийся список для полей, которые являются внешними ключами в другие таблицы. Для использования класса просто вызовите QAbstractItemView::setItemDelegate() для представления с экземпляром QSqlRelationalDelegate:
std::unique_ptr<QTableView> view{new QTableView};
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view.get())); Пример relationaltablemodel демонстрирует, как использовать QSqlRelationalTableModel в сочетании с QSqlRelationalDelegate для предоставления таблиц с поддержкой внешних ключей.
Примечания:
- Таблица должна иметь объявленный первичный ключ.
- Первичный ключ таблицы не может содержать связь с другой таблицей.
- Если реляционная таблица содержит ключи, которые ссылаются на несуществующие строки в связанной таблице, строки, содержащие недействительные ключи, не будут отображаться через модель. Пользователь или база данных отвечает за поддержание целостности ссылок.
- Если имя столбца отображения отношения также используется как имя столбца в реляционной таблице или используется как имя столбца отображения в более чем одном отношении, оно будет алиасировано. Алиас — это имя таблицы отношения, имя столбца отображения и уникальный идентификатор, соединенные подчеркиванием (например, tablename_columnname_id). QSqlRecord::fieldName() вернёт алиасированное имя столбца. Все случаи дублирования имени столбца отображения алиасируются при обнаружении дублирования, но никакое алиасирование не выполняется для имён столбцов в основной таблице. Алиасирование не влияет на QSqlRelation, поэтому QSqlRelation::displayColumn() вернёт исходное имя столбца отображения.
- Имя таблицы ссылки алиасируется. Алиас — слово «relTblAl», а индекс связанного столбца соединён подчеркиванием (например, relTblAl_2). Алиас может использоваться для фильтрации таблицы (например, setFilter("relTblAl_2='Oslo' OR relTblAl_3='USA'")).
- При использовании setData() роль всегда должна быть Qt::EditRole, а при использовании data() — всегда Qt::DisplayRole.
См. также QSqlRelation, QSqlRelationalDelegate и Пример реляционной модели таблицы.
Документация типов членов
перечисление QSqlRelationalTableModel::JoinMode
| Постоянная | Значение | Описание |
|---|---|---|
QSqlRelationalTableModel::InnerJoin |
0 |
- Режим внутреннего объединения, возвращает строки, когда существует хотя бы один совпадающий элемент в обеих таблицах. |
QSqlRelationalTableModel::LeftJoin |
1 |
- Режим левого объединения, возвращает все строки из левой таблицы (table_name1), даже если в правой таблице (table_name2) нет совпадений. |
Это перечисление было введено или изменено в Qt 4.8.
См. также QSqlRelationalTableModel::setJoinMode().
Документация функций членов
QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase())
Создаёт пустой QSqlRelationalTableModel и устанавливает родителя в parent, а подключение к базе данных — в db. Если db недействительно, будет использоваться подключение по умолчанию.
[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)
Переопределяет: QSqlTableModel::revertRow(int row).
[virtual] QSqlRelationalTableModel::~QSqlRelationalTableModel()
Удаляет объект и освобождает все выделенные ресурсы.
[override virtual] void QSqlRelationalTableModel::clear()
Переопределяет: QSqlTableModel::clear().
[override virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Переопределяет: QSqlTableModel::data(const QModelIndex &index, int role) const.
См. также setData().
[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
Переопределяет: QSqlTableModel::insertRowIntoTable(const QSqlRecord &values).
[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const
Переопределяет: QSqlTableModel::orderByClause() const.
QSqlRelation QSqlRelationalTableModel::relation(int column) const
Возвращает отношение для столбца column или недействительное отношение, если отношение не задано.
См. также setRelation() и QSqlRelation::isValid().
[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const
Возвращает объект QSqlTableModel для доступа к таблице, для которой column является внешним ключом, или nullptr , если для данного column нет отношения.
Возвращаемый объект принадлежит объекту QSqlRelationalTableModel.
См. также setRelation() и relation().
[override virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
Переопределяет: QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent).
[override virtual] bool QSqlRelationalTableModel::select()
Переопределяет: QSqlTableModel::select().
[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const
Переопределяет: QSqlTableModel::selectStatement() const.
[override virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
Переопределяет: QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role).
Устанавливает данные для роли role в элементе с указанным index на заданное значение value. В зависимости от стратегии редактирования, значение может быть применено к базе данных сразу или может быть кэшировано в модели.
Возвращает true , если значение можно установить, или false при ошибке (например, если index находится за пределами допустимого диапазона).
Для реляционных столбцов value должно быть индексом, а не отображаемым значением. Индекс также должен существовать в связанной таблице, иначе функция возвращает false.
См. также editStrategy(), data(), submit() и revertRow().
void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
Устанавливает режим SQL-соединения joinMode для отображения или скрытия строк с NULL внешними ключами. В режиме InnerJoin (по умолчанию) эти строки не отображаются: используйте режим LeftJoin, если нужно их отобразить.
Данная функция была добавлена в Qt 4.8.
См. также QSqlRelationalTableModel::JoinMode.
[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)
Устанавливает для указанного column внешний ключ, определенный relation.
Пример:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name")); Вызов setRelation() указывает, что столбец 2 в таблице employee является внешним ключом, который сопоставляется с полем id таблицы city, и что представление должно отобразить пользователю поле city с полем name.
Примечание: первичный ключ таблицы может не содержать отношения с другой таблицей.
См. также relation().
[override virtual] void QSqlRelationalTableModel::setTable(const QString &table)
Переопределяет: QSqlTableModel::setTable(const QString &tableName).
[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)
Переопределяет: QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsqlrelationaltablemodel.html