Класс QSqlTableModel
Класс QSqlTableModel предоставляет редактируемую модель данных для одной таблицы базы данных. Подробнее...
| Заголовок: | #include <QSqlTableModel> |
| qmake: | QT += sql |
| Наследуется от: | QSqlQueryModel |
| Наследует: |
Типы публичного доступа
| Перечисление | EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit } |
Функции публичного доступа
| QSqlTableModel(QObject *parent = nullptr, 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 |
| виртуальный 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 |
- 17 функций публичного доступа унаследованных от QSqlQueryModel
- 7 функций публичного доступа унаследованных от QAbstractTableModel
- 43 функций публичного доступа унаследованных от QAbstractItemModel
- 34 функций публичного доступа унаследованных от QObject
Слот публичного доступа
| виртуальный void | revert() override |
| void | revertAll() |
| виртуальный bool | select() |
| виртуальный bool | selectRow(int row) |
| виртуальный bool | submit() override |
| bool | submitAll() |
- 2 слота публичного доступа унаследованных от QAbstractItemModel
- 1 слот публичного доступа унаследованных от QObject
Сигналы
| void | beforeDelete(int row) |
| void | beforeInsert(QSqlRecord &record) |
| void | beforeUpdate(int row, QSqlRecord &record) |
| void | primeInsert(int row, QSqlRecord &record) |
- 18 сигналов унаследованных от QAbstractItemModel
- 2 сигналов унаследованных от QObject
Защищённые функции
| virtual bool | удалитьСтрокуИзТаблицы(int row) |
| virtual bool | вставитьСтрокуВТаблицу(const QSqlRecord &values) |
| virtual QString | сортировка() const |
| QSqlRecord | первичныеЗначения(int row) const |
| virtual QString | запросВыбора() const |
| void | установитьПервичныйКлюч(const QSqlIndex &key) |
| void | установитьЗапрос(const QSqlQuery &query) |
| virtual bool | обновитьСтрокуВТаблице(int row, const QSqlRecord &values) |
Реализованные защищённые функции
| virtual QModelIndex | индексВЗапросе(const QModelIndex &item) const override |
- 3 защищённых функции, унаследованные от QSqlQueryModel
- 19 защищённых функций, унаследованные от QAbstractItemModel
- 9 защищённых функций, унаследованные от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 1 публичная переменная, унаследованная от QAbstractTableModel
- 1 публичная переменная, унаследованная от QAbstractItemModel
- 1 публичная переменная, унаследованная от QObject
- 2 статические публичные члены, унаследованные от QAbstractTableModel
- 2 статических публичных члена, унаследованные от QAbstractItemModel
- 10 статических публичных членов, унаследованных от QObject
- 1 защищённый слот, унаследованный от QAbstractItemModel
- 2 защищённых переменных, унаследованные от QObject
Подробное описание
Класс QSqlTableModel предоставляет редактируемую модель данных для одной таблицы базы данных.
QSqlTableModel — это высокоуровневый интерфейс для чтения и записи записей базы данных из одной таблицы. Он построен на основе QSqlQuery и может использоваться для предоставления данных классам-представлениям, таким как QTableView. Например:
QSqlTableModel *model = new QSqlTableModel(parentObject, database);
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, QSqlDatabase db = QSqlDatabase())
Создаёт пустую модель QSqlTableModel и задаёт родителя parent и подключение к базе данных db. Если db не валидно, будет использоваться подключение по умолчанию.
Стратегия редактирования по умолчанию — OnRowChange.
[virtual] QSqlTableModel::~QSqlTableModel()
Уничтожает объект и освобождает все выделенные ресурсы.
[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.
Обратите внимание, что будут обновлены только значения, помеченные как сгенерированные. Флаг generated можно задать с помощью QSqlRecord::setGenerated() и проверить с помощью QSqlRecord::isGenerated().
См. также QSqlRecord::isGenerated().
[override virtual] void QSqlTableModel::clear()
Переопределено из QSqlQueryModel::clear().
[override virtual] QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Переопределено из QSqlQueryModel::data().
См. также 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().
[override virtual] QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
Переопределено из QSqlQueryModel::headerData().
[override virtual protected] QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
Переопределено из QSqlQueryModel::indexInQuery().
Возвращает индекс значения в наборе результатов базы данных для данного элемента 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().
Вставляет count пустых строк в позицию row. Обратите внимание, что parent должна быть недействительной, так как эта модель не поддерживает родительско-дочерние отношения.
Для стратегий редактирования OnFieldChange и OnRowChange может быть вставлена только одна строка за раз, и в модели не может быть других кэшированных изменений.
Сигнал primeInsert() будет выдан для каждой новой строки. Подключитесь к нему, если хотите инициализировать новую строку значениями по умолчанию.
Не отправляет строки, независимо от стратегии редактирования.
Возвращает false если параметры выходят за пределы или строка не может быть вставлена; в противном случае возвращает true.
См. также primeInsert() и insertRecord().
bool QSqlTableModel::isDirty(const QModelIndex &index) const
Возвращает true если значение по индексу index несохранено, в противном случае false. Несохраненные значения — это значения, которые были изменены в модели, но ещё не записаны в базу данных.
Если index недействительна или указывает на несуществующую строку, возвращается false.
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] QSqlRecord QSqlTableModel::primaryValues(int row) const
Возвращает запись, содержащую поля, представленные в первичном ключе, установленные в значениях в строке row. Если первичный ключ не определён, возвращаемая запись будет содержать все поля.
Этот метод был введён в Qt 5.1.
См. также primaryKey().
[signal] void QSqlTableModel::primeInsert(int row, QSqlRecord &record)
Этот сигнал испускается insertRows(), когда инициализируется вставка в заданной строке row текущей активной таблицы базы данных. Параметр record можно изменять (поскольку это ссылка), например, для заполнения некоторых полей значениями по умолчанию и установки сгенерированных флагов полей. Не пытайтесь изменять запись другими способами, такими как setData() или setRecord(), при обработке этого сигнала.
QSqlRecord QSqlTableModel::record() const
Это перегруженный метод.
Возвращает пустую запись, содержащую только имена полей. Этот метод можно использовать для извлечения имён полей записи.
См. также setRecord() и QSqlRecord::isEmpty().
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().
Удаляет count столбцов из модели parent, начиная с индекса column.
Возвращает true, если столбцы были успешно удалены; в противном случае возвращает false.
См. также removeRows().
[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
Переопределено из QAbstractItemModel::removeRows().
Удаляет count строк, начиная со строки row. Поскольку эта модель не поддерживает иерархические структуры, parent должна быть недействительным индексом модели.
Когда стратегия редактирования — OnManualSubmit, удаление строк из базы данных откладывается до вызова submitAll().
Для OnFieldChange и OnRowChange может быть удалена только одна строка за раз и только если у другой строки нет кэшированных изменений. Удаления отправляются в базу данных немедленно. Модель сохраняет пустую строку для успешно удаленной строки до обновления с помощью select().
После неудаленного удаления операция не отменяется в модели. Приложение может повторно отправить или отменить.
Вставленные, но ещё не успешно отправленные строки в удаляемом диапазоне немедленно удаляются из модели.
END_OF_DOCUMENT_MARKERПеред удалением строки из базы данных, испускается сигнал beforeDelete().
Если строка < 0 или строка + количество > rowCount(), никаких действий не выполняется и возвращается false. Возвращает true , если все строки были удалены; в противном случае возвращает false. Подробную информацию об ошибке базы данных можно получить, используя lastError().
См. также removeColumns() и insertRows().
[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] void QSqlTableModel::revertRow(int row)
Отменяет все изменения для указанной строки row.
См. также revert(), revertAll(), submit() и submitAll().
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const
Переопределено из QSqlQueryModel::rowCount().
[virtual slot] bool QSqlTableModel::select()
Заполняет модель данными из таблицы, которая была установлена с помощью setTable(), используя указанный фильтр и условие сортировки, и возвращает true в случае успеха; в противном случае возвращает false.
Примечание: Вызов select() приведет к отмене любых несохраненных изменений и удалению любых вставленных столбцов.
См. также setTable(), setFilter() и selectStatement().
[virtual slot] bool QSqlTableModel::selectRow(int row)
Обновляет row в модели значениями из строки таблицы базы данных, соответствующей значениям первичного ключа. Без первичного ключа все значения столбцов должны совпадать. Если соответствующая строка не найдена, модель отобразит пустую строку.
Возвращает true в случае успеха; в противном случае возвращает false.
Эта функция была добавлена в Qt 5.0.
См. также select().
[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().
Устанавливает данные для элемента index для роли role на value.
Для стратегии редактирования OnFieldChange, индекс может получить изменение только в том случае, если ни один другой индекс не имеет кэшированного изменения. Изменения отправляются немедленно. Однако строки, которые ещё не были вставлены в базу данных, могут быть изменены свободно и не отправляются автоматически. Отправленные изменения не отменяются при ошибке.
Для OnRowChange, индекс может получить изменение только в том случае, если ни одна другая строка не имеет кэшированного изменения. Изменения не отправляются автоматически.
Возвращает true , если value равно текущему значению. Однако значение не будет отправлено в базу данных.
Возвращает true , если значение может быть установлено или false при ошибке, например, если index выходит за пределы допустимых значений.
См. также 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().
END_OF_DOCUMENT_MARKER
[override virtual] void QSqlTableModel::sort(int column, Qt::SortOrder order)
Переопределено из QAbstractItemModel::sort().
Сортирует данные по column в порядке order. Это немедленно выберет данные, используйте setSort(), чтобы установить порядок сортировки без заполнения модели данными.
См. также setSort(), select() и orderByClause().
[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().
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/archives/qt-5.11/qsqltablemodel.html