Класс QSqlTableModel
Класс QSqlTableModel предоставляет редактируемую модель данных для одной таблицы базы данных. Подробнее...
| Заголовок: | #include <QSqlTableModel> |
| CMake: | find_package(Qt6 COMPONENTS Sql REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
| Наследует: | QSqlQueryModel |
| Наследуется от: |
Типы публичного доступа
| перечисление | EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit } |
Функции публичного доступа
| QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase()) | |
| виртуальный | ~QSqlTableModel() |
| QSqlDatabase | database() const |
| QSqlTableModel::EditStrategy | editStrategy() const |
| int | fieldIndex(const QString &fieldName) const |
| QString | filter() const |
| bool | insertRecord(int row, const QSqlRecord &record) |
| bool | isDirty(const QModelIndex &index) const |
| bool | isDirty() const |
| QSqlIndex | primaryKey() const |
| QSqlRecord | record() const |
| QSqlRecord | record(int row) const |
| виртуальный void | revertRow(int row) |
| виртуальный void | setEditStrategy(QSqlTableModel::EditStrategy strategy) |
| виртуальный void | setFilter(const QString &filter) |
| bool | setRecord(int row, const QSqlRecord &values) |
| виртуальный void | setSort(int column, Qt::SortOrder order) |
| виртуальный void | setTable(const QString &tableName) |
| QString | tableName() const |
Переопределённые функции публичного доступа
| виртуальный void | clear() override |
| виртуальный bool | clearItemData(const QModelIndex &index) override |
| виртуальный QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const override |
| виртуальный Qt::ItemFlags | flags(const QModelIndex &index) const override |
| виртуальный QVariant | headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override |
| виртуальный bool | insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override |
| виртуальный bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
| виртуальный bool | removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override |
| виртуальный int | rowCount(const QModelIndex &parent = QModelIndex()) const override |
| виртуальный bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override |
| виртуальный void | sort(int column, Qt::SortOrder order) override |
Свойства публичного доступа
| виртуальный void | revert() override |
| void | revertAll() |
| виртуальный bool | select() |
| виртуальный bool | selectRow(int row) |
| виртуальный bool | submit() override |
| bool | submitAll() |
Сигналы
| void | beforeDelete(int row) |
| void | beforeInsert(QSqlRecord &record) |
| void | beforeUpdate(int row, QSqlRecord &record) |
| void | primeInsert(int row, QSqlRecord &record) |
Защищённые функции
| virtual bool | deleteRowFromTable(int row) |
| virtual bool | insertRowIntoTable(const QSqlRecord &values) |
| virtual QString | orderByClause() const |
| QSqlRecord | primaryValues(int row) const |
| virtual QString | selectStatement() const |
| void | setPrimaryKey(const QSqlIndex &key) |
| void | setQuery(const QSqlQuery &query) |
| virtual bool | updateRowInTable(int row, const QSqlRecord &values) |
Реализованные защищённые функции
| virtual QModelIndex | indexInQuery(const QModelIndex &item) const override |
Подробное описание
QSqlTableModel — это высокоуровневый интерфейс для чтения и записи записей базы данных из одной таблицы. Он построен поверх более низкоуровневого QSqlQuery и может использоваться для предоставления данных классам представлений, таким как QTableView. Например:
QSqlTableModel *model = new QSqlTableModel;
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
view->hideColumn(0); // don't show the ID
view->show(); Мы устанавливаем имя SQL-таблицы и стратегию редактирования, а затем настраиваем метки, отображаемые в заголовке представления. Стратегия редактирования определяет, когда изменения, внесённые пользователем в представлении, фактически применяются к базе данных. Возможные значения — OnFieldChange, OnRowChange и OnManualSubmit.
QSqlTableModel также может использоваться для доступа к базе данных программно, без привязки к представлению:
QSqlTableModel model;
model.setTable("employee");
model.select();
int salary = model.record(4).value("salary").toInt(); Приведённый фрагмент кода извлекает поле salary из записи 4 в наборе результатов запроса SELECT * from employee.
Возможна установка фильтров с помощью setFilter() или изменение порядка сортировки с помощью setSort(). В конце необходимо вызвать select() для заполнения модели данными.
Пример tablemodel иллюстрирует, как использовать QSqlTableModel в качестве источника данных для QTableView.
QSqlTableModel не поддерживает напрямую внешние ключи. Используйте QSqlRelationalTableModel и QSqlRelationalDelegate, если нужно разрешить внешние ключи.
См. также QSqlRelationalTableModel, QSqlQuery, Программирование моделей/представлений, Пример табличной модели и Пример кэшированной таблицы.
Документация типов членов
перечисление QSqlTableModel::EditStrategy
Это тип перечисления, описывающий стратегию выбора при редактировании значений в базе данных.
| Постоянная | Значение | Описание |
|---|---|---|
QSqlTableModel::OnFieldChange |
0 |
Все изменения модели будут немедленно применяться к базе данных. |
QSqlTableModel::OnRowChange |
1 |
Изменения строки будут применяться, когда пользователь выберет другую строку. |
QSqlTableModel::OnManualSubmit |
2 |
Все изменения будут кэшироваться в модели до вызова submitAll() или revertAll(). |
Примечание: Чтобы предотвратить вставку в базу данных только частично инициализированных строк, OnFieldChange будет вести себя как OnRowChange для вновь вставленных строк.
См. также setEditStrategy().
Документация по функциям-членам
QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
Создаёт пустой QSqlTableModel и устанавливает родительский элемент в parent, а подключение к базе данных — в db. Если db недействительно, будет использоваться подключение к базе данных по умолчанию.
Стратегия редактирования по умолчанию — OnRowChange.
[signal] void QSqlTableModel::beforeDelete(int row)
Этот сигнал излучается deleteRowFromTable() перед удалением строки row из активной таблицы базы данных.
[signal] void QSqlTableModel::beforeInsert(QSqlRecord &record)
Этот сигнал излучается insertRowIntoTable() перед вставкой новой строки в активную таблицу базы данных. Значения, которые будут вставлены, хранятся в record и могут быть изменены перед вставкой.
[signal] void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)
Этот сигнал излучается updateRowInTable() перед обновлением строки row в активной таблице базы данных значениями из record.
Обратите внимание, что будут обновлены только значения, помеченные как сгенерированные. Флаг сгенерированного значения может быть установлен с помощью QSqlRecord::setGenerated() и проверен с помощью QSqlRecord::isGenerated().
См. также QSqlRecord::isGenerated().
[signal] void QSqlTableModel::primeInsert(int row, QSqlRecord &record)
Этот сигнал излучается insertRows() при инициировании вставки в заданной строке row активной таблицы базы данных. Параметр record можно изменять (поскольку это ссылка), например, для заполнения некоторых полей значениями по умолчанию и установки флагов сгенерированных полей. Не пытайтесь редактировать запись другими способами, такими как setData() или setRecord(), при обработке этого сигнала.
[override virtual slot] void QSqlTableModel::revert()
Реализует: QAbstractItemModel::revert().
Этот переопределённый слот вызывается делегатами элементов, когда пользователь отменил редактирование текущей строки.
Отменяет изменения, если стратегия модели установлена в OnRowChange или OnFieldChange. Не делает ничего для стратегии OnManualSubmit.
Используйте revertAll(), чтобы отменить все ожидаемые изменения для стратегии OnManualSubmit, или revertRow(), чтобы отменить определённую строку.
См. также submit(), submitAll(), revertRow() и revertAll().
[slot] void QSqlTableModel::revertAll()
Отменяет все ожидаемые изменения.
См. также revert(), revertRow() и submitAll().
[virtual slot] bool QSqlTableModel::select()
Заполняет модель данными из таблицы, заданной через setTable(), используя заданный фильтр и условие сортировки, и возвращает true при успехе; в противном случае возвращает false.
Примечание: Вызов select() отменяет любые неотправленные изменения и удаляет любые вставленные столбцы.
См. также setTable(), setFilter() и selectStatement().
[virtual slot, since 5.0] bool QSqlTableModel::selectRow(int row)
Обновляет строку row в модели значениями из строки таблицы базы данных, соответствующей значениям первичного ключа. Без первичного ключа все значения столбцов должны совпадать. Если соответствующей строки не найдено, в модели будет показана пустая строка.
Возвращает true при успехе; в противном случае возвращает false.
Эта функция была введена в Qt 5.0.
См. также select().
[override virtual slot] bool QSqlTableModel::submit()
Реализует: QAbstractItemModel::submit().
Этот переопределённый слот вызывается делегатами элементов, когда пользователь закончил редактирование текущей строки.
Отправляет текущую редактируемую строку, если стратегия модели установлена в OnRowChange или OnFieldChange. Ничего не делает для стратегии OnManualSubmit.
Используйте submitAll(), чтобы отправить все ожидающие изменения для стратегии OnManualSubmit.
Возвращает true при успехе; в противном случае возвращает false. Используйте lastError(), чтобы получить подробную информацию об ошибке.
Не перестраивает модель автоматически. Отправленные строки обновляются из базы данных при успехе.
См. также revert(), revertRow(), submitAll(), revertAll() и lastError().
[slot] bool QSqlTableModel::submitAll()
Отправляет все ожидающие изменения и возвращает true при успехе. Возвращает false при ошибке, подробная информация об ошибке может быть получена с помощью lastError().
В режиме OnManualSubmit при успехе модель будет перестроена. Любые представления, отображающие её, потеряют свои выделения.
Примечание: в режиме OnManualSubmit уже отправленные изменения не будут очищены из кэша, если submitAll() завершится неудачно. Это позволяет отменять транзакции и повторно отправлять их без потери данных.
См. также revertAll() и lastError().
[virtual] QSqlTableModel::~QSqlTableModel()
Уничтожает объект и освобождает выделенные ресурсы.
[override virtual] void QSqlTableModel::clear()
Реализует: QSqlQueryModel::clear().
[override virtual] bool QSqlTableModel::clearItemData(const QModelIndex &index)
Реализует: QAbstractItemModel::clearItemData(const QModelIndex &index).
[override virtual] QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Реализует: QSqlQueryModel::data(const QModelIndex &item, int role) const.
См. также setData().
QSqlDatabase QSqlTableModel::database() const
Возвращает подключение к базе данных модели.
[virtual protected] bool QSqlTableModel::deleteRowFromTable(int row)
Удаляет указанную строку row из текущей активной таблицы базы данных.
Это метод низкого уровня, работающий непосредственно с базой данных, и его не следует вызывать напрямую. Используйте removeRow() или removeRows() для удаления значений. Модель определит, когда необходимо изменить базу данных, в зависимости от своей стратегии редактирования.
Возвращает true если строка была удалена; в противном случае возвращает false.
См. также removeRow() и removeRows().
QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const
Возвращает текущую стратегию редактирования.
См. также setEditStrategy().
int QSqlTableModel::fieldIndex(const QString &fieldName) const
Возвращает индекс поля fieldName или -1, если соответствующее поле отсутствует в модели.
QString QSqlTableModel::filter() const
Возвращает текущий установленный фильтр.
См. также setFilter() и select().
[override virtual] Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
Реализует: QAbstractTableModel::flags(const QModelIndex &index) const.
[override virtual] QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
Реализует: QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role) const.
[override virtual protected] QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
Реализует: QSqlQueryModel::indexInQuery(const QModelIndex &item) const.
Возвращает индекс значения в наборе результатов базы данных для данного элемента item в модели.
Возвращаемое значение идентично item, если столбцы или строки не были вставлены, удалены или перемещены.
Возвращает недопустимый индекс модели, если item выходит за границы или если item не указывает на значение в наборе результатов.
См. также QSqlQueryModel::indexInQuery().
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
Вставляет record в позицию row. Если row отрицательно, запись будет добавлена в конец. Вызывает insertRows() и setRecord() внутри.
Возвращает true если запись была вставлена, в противном случае false.
Изменения отправляются немедленно для OnFieldChange и OnRowChange. Ошибка не оставляет новой строки в модели.
См. также insertRows(), removeRows() и setRecord().
[virtual protected] bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)
Вставляет значения values в текущую активную таблицу базы данных.
Это метод низкого уровня, работающий непосредственно с базой данных, и его не следует вызывать напрямую. Используйте insertRow() и setData() для вставки значений. Модель определит, когда необходимо изменить базу данных, в зависимости от своей стратегии редактирования.
Возвращает true если значения были вставлены, в противном случае false. Информация об ошибке может быть получена с помощью lastError().
См. также lastError(), insertRow() и insertRows().
[override virtual] bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
Реализует: QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent).
Вставляет count пустых строк в позицию row. Обратите внимание, что parent должен быть недействительным, так как эта модель не поддерживает родительско-дочерние отношения.
Для стратегий редактирования OnFieldChange и OnRowChange может быть вставлена только одна строка за раз, и модель не может содержать другие кэшированные изменения.
Сигнал primeInsert() будет выпущен для каждой новой строки. Подключитесь к нему, если хотите инициализировать новую строку значениями по умолчанию.
Не отправляет строки, независимо от стратегии редактирования.
Возвращает false если параметры выходят за пределы допустимых значений или строка не может быть вставлена; в противном случае возвращает true.
См. также primeInsert() и insertRecord().
bool QSqlTableModel::isDirty(const QModelIndex &index) const
Возвращает true если значение в индексе index изменённое, иначе false. Изменённые значения - это значения, которые были изменены в модели, но ещё не были записаны в базу данных.
Если index недействителен или указывает на несуществующую строку, возвращается false.
[since 5.0] bool QSqlTableModel::isDirty() const
Это перегруженная функция.
Возвращает true если модель содержит изменённые значения, которые не были сохранены в базе данных, в противном случае false.
Эта функция была добавлена в Qt 5.0.
[virtual protected] QString QSqlTableModel::orderByClause() const
Возвращает SQL ORDER BY предложение, основанное на текущем порядке сортировки.
См. также setSort() и selectStatement().
QSqlIndex QSqlTableModel::primaryKey() const
Возвращает первичный ключ для текущей таблицы или пустой QSqlIndex, если таблица не задана или не имеет первичного ключа.
См. также setTable(), setPrimaryKey() и QSqlDatabase::primaryIndex().
[protected, since 5.1] QSqlRecord QSqlTableModel::primaryValues(int row) const
Возвращает запись, содержащую поля, представленные в первичном ключе, установленные для значений в строке row. Если первичный ключ не определён, возвращаемая запись будет содержать все поля.
Эта функция была добавлена в Qt 5.1.
См. также primaryKey().
QSqlRecord QSqlTableModel::record() const
Это перегруженная функция.
Она возвращает пустую запись, содержащую только имена полей. Эту функцию можно использовать для получения имён полей записи.
См. также setRecord() и QSqlRecord::isEmpty().
[since 5.0] QSqlRecord QSqlTableModel::record(int row) const
Возвращает запись в строке row в модели.
Если row — индекс корректной строки, запись будет заполнена значениями из этой строки.
Если модель не инициализирована, будет возвращена пустая запись.
Эта функция была добавлена в Qt 5.0.
См. также QSqlRecord::isEmpty().
[override virtual] bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
Переопределяет: QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent).
Удаляет count столбцов из модели parent, начиная со столбца с индексом column.
Возвращает true, если столбцы были успешно удалены; в противном случае возвращает false.
См. также removeRows().
[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
Переопределяет: QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent).
Удаляет count строк, начиная со строки row. Поскольку эта модель не поддерживает иерархические структуры, parent должна быть некорректным индексом модели.
Когда стратегия редактирования — OnManualSubmit, удаление строк из базы данных откладывается до вызова submitAll().
Для OnFieldChange и OnRowChange может быть удалена только одна строка за раз, и только если у другой строки нет кэшированных изменений. Удаления сразу отправляются в базу данных. Модель сохраняет пустую строку для успешно удалённой строки до её обновления с помощью select().
После неудачного удаления операция не отменяется в модели. Приложение может повторно отправить или отменить операцию.
Вставленные, но ещё не отправленные в базу данные строки в удаляемом диапазоне сразу удаляются из модели.
Перед удалением строки из базы данных излучается сигнал beforeDelete().
Если row < 0 или row + count > rowCount(), никаких действий не выполняется, и возвращается false. Возвращает true, если все строки были удалены; в противном случае возвращает false. Подробную информацию об ошибках базы данных можно получить, используя lastError().
См. также removeColumns() и insertRows().
[virtual] void QSqlTableModel::revertRow(int row)
Отменяет все изменения для указанной строки row.
См. также revert(), revertAll(), submit() и submitAll().
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const
Переопределяет: QSqlQueryModel::rowCount(const QModelIndex &parent) const.
[virtual protected] QString QSqlTableModel::selectStatement() const
Возвращает SQL SELECT оператор, используемый внутри для заполнения модели. Оператор включает в себя фильтр и ORDER BY условие.
См. также filter() и orderByClause().
[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
Переопределяет: QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role).
Устанавливает данные для элемента index для роли role в value.
Для стратегии редактирования OnFieldChange индекс может получить изменение только если у другого индекса нет кэшированных изменений. Изменения отправляются сразу. Однако, строки, которые ещё не были вставлены в базу данных, могут быть изменены свободно и не отправляются автоматически. Отправленные изменения не отменяются при ошибке.
Для OnRowChange индекс может получить изменение только если у другой строки нет кэшированных изменений. Изменения не отправляются автоматически.
Возвращает true, если value равно текущему значению. Однако значение не будет отправлено в базу данных.
Возвращает false в случае ошибки, например, если index вне диапазона.
Возвращает false, если роль не Qt::EditRole. Для установки данных для ролей, отличных от EditRole, используйте либо пользовательскую модель-прокси, либо подкласс QSqlTableModel.
См. также editStrategy(), data(), submit(), submitAll() и revertRow().
[virtual] void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)
Устанавливает стратегию редактирования значений в базе данных на strategy.
Это приведет к отмене любых ожидающих изменений.
См. также editStrategy() и revertAll().
[virtual] void QSqlTableModel::setFilter(const QString &filter)
Устанавливает текущий фильтр на filter.
Фильтр — это SQL WHERE условие без ключевого слова WHERE (например, name='Josephine')).
Если модель уже заполнена данными из базы данных, модель перевыбирает данные с новым фильтром. В противном случае фильтр будет применён при следующем вызове select().
См. также filter(), select(), selectStatement() и orderByClause().
[protected] void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)
Защищённый метод, позволяющий подклассам установить первичный ключ на key.
Обычно первичный индекс устанавливается автоматически при вызове setTable().
См. также primaryKey() и QSqlDatabase::primaryIndex().
[protected] void QSqlTableModel::setQuery(const QSqlQuery &query)
Эта функция просто вызывает QSqlQueryModel::setQuery(query). Вам обычно не следует вызывать её для QSqlTableModel. Вместо этого используйте setTable(), setSort(), setFilter() и т.д. для настройки запроса.
См. также selectStatement().
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
Применяет values к строке row в модели. Источник и целевые поля сопоставляются по имени поля, а не по позиции в записи.
Обратите внимание, что сгенерированные флаги в values сохраняются для определения того, используются ли соответствующие поля при отправке изменений в базу данных. По умолчанию он установлен в true для всех полей в QSqlRecord. Необходимо установить флаг на false с помощью setGenerated(false) для любого значения в values, чтобы сохранить изменения обратно в базу данных.
Для стратегий редактирования OnFieldChange и OnRowChange строка может получить изменение только если у другой строки нет кэшированных изменений. Изменения отправляются сразу. Отправленные изменения не отменяются при ошибке.
Возвращает true если все значения были установлены; в противном случае возвращает false.
См. также record() и editStrategy().
[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order)
Устанавливает порядок сортировки для column на order. Это не влияет на текущие данные, чтобы обновить данные с новым порядком сортировки, вызовите select().
См. также sort(), select() и orderByClause().
[virtual] void QSqlTableModel::setTable(const QString &tableName)
Устанавливает таблицу базы данных, с которой работает модель, на tableName. Не выбирает данные из таблицы, но извлекает информацию о её полях.
Чтобы заполнить модель данными из таблицы, вызовите select().
Информация об ошибках может быть получена с помощью lastError().
См. также select(), setFilter() и lastError().
[override virtual] void QSqlTableModel::sort(int column, Qt::SortOrder order)
Переопределяет: QAbstractItemModel::sort(int column, Qt::SortOrder order).
Сортирует данные по column с порядком сортировки order. Это немедленно выберет данные, используйте setSort() для установки порядка сортировки без заполнения модели данными.
См. также setSort(), select() и orderByClause().
QString QSqlTableModel::tableName() const
Возвращает имя текущей выбранной таблицы.
[virtual protected] bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
Обновляет заданную строку row в текущей активной таблице базы данных с указанными values. Возвращает true при успехе; в противном случае возвращает false.
Это метод низкого уровня, который работает напрямую с базой данных и не должен вызываться напрямую. Используйте setData() для обновления значений. Модель сама решит, когда и как изменить базу данных, в зависимости от своей стратегии редактирования.
Обратите внимание, что обновляются только значения, у которых установлен флаг generated. Флаг generated можно установить с помощью QSqlRecord::setGenerated() и проверить с помощью QSqlRecord::isGenerated().
См. также QSqlRecord::isGenerated() и setData().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qsqltablemodel.html