Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_GIIS.docx
Скачиваний:
7
Добавлен:
01.03.2025
Размер:
120 Кб
Скачать
☆

16. Библиотека qt. Работа с бд. Модели для работы с бд (qSqlTableModel).

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

QSqlTableModel - это высокоуровневый интерфейс к записям одной таблицы базы данных с возможностью и чтения и записи. Он является надстройкой нижнего уровня QSqlQuery и может быть использован, чтобы предоставлять данные для классов представлений, таких как QTableView. Например:

QSqlTableModel *model = new QSqlTableModel;

model->setTable("employee");

model->setEditStrategy(QSqlTableModel::OnManualSubmit);

model->select();

model->removeColumn(0); // don't show the ID

model->setHeaderData(0, Qt::Horizontal, tr("Name"));

model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

QTableView *view = new QTableView;

view->setModel(model);

view->show();

Мы устанавливаем имя SQL таблицы и стратегию редактирования, затем мы устанавливаем метки отображаемые в заголовках представления. Стратегия редактирования предписывает, когда изменения сделанные пользователем в представлении применяются в базе данных. Возможные значения стратегии - это OnFieldChange, OnRowChange и OnManualSubmit.

QSqlTableModel может быть также использован для доступа к базе данных программно, без связывания ее с представлением:

QSqlTableModel model;

model.setTable("employee");

QString name = model.record(4).value("name").toString();

Фрагмент кода выше извлекает поле salary из четвёртой записи, выбранной по запросу SELECT * from employee.

Имеется возможность установить фильтры, используя setFilter(), или изменить порядок сортировки с помощью setSort(). В конце вы должны вызвать select(), чтобы заполнить модель данными.

QSqlTableModel не предоставляет непосредственную поддержку внешних ключей. Если вы хотите разрешить внешние ключи, используйте QSqlRelationalTableModel и QSqlRelationalDelegate.

Драйвер QSQLITE блокирует обновления до тех пор, пока не выполнены все выборки. QSqlTableModel доставляет данные (QSqlQuery::fetchMore()) в необходимом виде; это может приводить к обновлениям по тайм-ауту.

17. Библиотека qt. Работа с бд. Связь модели qSqlTableModel с виджетом qTableView.

Классы QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel могут использоваться в качестве источников данных для классов представлений Qt, таких как QListView, QTableView и QTreeView. На практике наиболее часто используется QTableView в связи с тем, что результирующая SQL выборка, по существу, представляет собой двумерную структуру данных.

В следующем примере создается представление основанное на модели данных SQL:

QTableView *view = new QTableView; view->setModel(model);

view->show();

Если модель является моделью для чтения-записи (например, QSqlTableModel), то представление позволяет редактировать поля. Вы можете отключить это с помощью следующего кода

view->setEditTriggers(QAbstractItemView::NoEditTriggers);

Вы можете использовать одну и ту-же модель в качестве источника данных для нескольких представлений. Если пользователь изменяет данные модели с помощью одного из представлений, другие представления немедленно отобразят изменения.

Классы-представления для обозначения колонок наверху отображают заголовки. Для изменения текста заголовка, вызовите setHeaderData() модели. Текстом заголовка по умолчанию является наименование поля. Например:

model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));

model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));

model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));

model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

QTableView также имеет вертикальные заголовки слева, содержащие номера строк. Если вы программно вставляете строки с помощью QSqlTableModel::insertRows(), новые колонки будут обозначены звездочкой (*) до тех пор, пока они не будут помещены в базу данных с помощью submitAll() или автоматически при переходе пользователя к другой записи (если стратегия редактирования равна QSqlTableModel::OnRowChange).

Аналогично, если вы удаляете строки с помощью removeRows(), они будут отмечены восклицательным знаком (!), пока изменения не будут внесены в базу данных.

Элементы представления отображаются с помощью делегата. Делегат по умолчанию QItemDelegate содержит большинство общих типов данных (int, QString, QImage и т.д.). Также делегат отвечает за предоставление виджета-редактора (например, combobox), когда пользователь начинает редактировать элемент представления. Вы можете создавать свои собственные делегаты, наследуя QAbstractItemDelegate или QItemDelegate. Для получения более подробной информации смотрите Программирование с помощью модели/представления.

QSqlTableModel оптимизирован для работы с одной таблицей в один момент времени. Если Вам нужна модель для чтения-записи, которая может работать с произвольной результирующей выборкой, вы можете создать подкласс QSqlQueryModel и переопределить flags() и setData() для возможности осуществлять чтение-запись. Две следующие функции делают поля 1 и 2 модели SQL запроса редактируемыми:

Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index)

{ Qt::ItemFlags flags = QSqlQueryModel::flags(index);

if (index.column() == 1 || index.column() == 2)

flags |= Qt::ItemIsEditable; return flags; }

bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */) { if (index.column() < 1 || index.column() > 2) return false;

QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);

int id = data(primaryKeyIndex).toInt(); clear(); bool ok;

if (index.column() == 1) { ok = setFirstName(id, value.toString());

} else { ok = setLastName(id, value.toString());

} refresh(); return ok; }

Вспомогательная функция setFirstName() определяется следующим образом:

bool EditableSqlModel::setFirstName(int personId, const QString &firstName)

{ QSqlQuery query;

query.prepare("update person set firstname = ? where id = ?");

query.addBindValue(firstName);

query.addBindValue(personId); return query.exec(); }

Функция setLastName() является подобной. Полный код реализации можно посмотреть в примере Query Model.

Создание подклассов модели делает возможной настройку собственной модели различными способами: вы можете предоставить подсказки к элементам, изменить цвет фона, отобразить вычисляемые значения, разрешать различным значениям быть отображенными и отредактированными, отдельно обработать нулевые значения и т.д. Для получения более подробной информации смотрите Программирование модель/представление и описание класса QAbstractItemView.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]