Spec-Zone.ru › Qt 6.1

Класс QSqlTableModel

Класс QSqlTableModel предоставляет редактируемую модель данных для одной таблицы базы данных. Подробнее...

Заголовок: #include <QSqlTableModel>
CMake: find_package(Qt6 COMPONENTS Sql REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
Наследуется от: QSqlQueryModel
Наследует:

QSqlRelationalTableModel

  • Список всех членов, включая унаследованные

Открытые типы

перечисление 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.1/qsqltablemodel.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API