![]() |
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции | ![]() |
[Предыдущая: Кроссплатформенные средства Qt 4 поддержки людей с ограниченными возможностями] [Начало] [Следующая: Модуль работы с сетью в Qt 4]
Прослойка графического интерфейса пользователя SQL-модуля Qt 4 была полностью перепроектирована для работы с Interview (новые классы модель/представление Qt). Модуль состоит из трех основных классов (QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel), которые хорошо работают с классами представлений Qt, особенно с QTableView.
SQL-классы Qt 4 разделены на три слоя:
Драйвера баз данных и классы ядра SQL, в основном, сохранились с Qt 3. Модели записей баз данных изменились в Qt 4; теперь они наследуют QAbstractItemModel и облегчают представление информации базы данных в классах отображения, таких как QListView, QTableView и QTreeView.
Основная идея SQL-модуля Qt 4 заключается в том, что отображать и редактировать информацию базы данных должно быть также легко, как и любую другую информация, основанную на записях. Изменяя модель данных во время выполнения, вы можете решать, в каком виде сохранять информацию: в базе данных SQL или, скажем, в файле XML. Этот основной подход имеет еще одно дополнительное преимущество - вы ничего не обязаны знать о SQL для того, чтобы отображать и редактировать данные.
SQL-модуль Qt 4 включает в себя три модели записей:
В комбинации с классами-представлениями Qt и классом-делегатом по умолчанию (QItemDelegate) модели Qt, классы работы с базами данных предлагают очень мощный механизм доступа к информации. Для большей гибкости отображения полей записи, вы можете создавать классы-наследники предопределенных классов, а для более полного контроля наследовать даже QAbstractItemDelegate или QItemDelegate.
Также можно изменять некоторые параметры без создания классов-наследников. Например, вы можете сортировать таблицу, используя QSqlTableModel::sort(), а создавать новые строки, осуществив соединение с сигналом QSqlTableModel::primeInsert().
Одна полезная особенность, поддержанная моделью чтения-записи, - это то, что возможно выполнять изменения записей без того, чтобы эти изменения попали в базу данных, пока не вызвана QSqlTableModel::submitAll(). Изменения можно отменить, вызвав QSqlTableModel::revertAll().
Многие классы выгодно отличаются от прослойки графического интерфейса пользователя SQL-модуля в Qt 3. Скорость и оптимизация работы с памятью в классах-инструментах (особенно QVariant, QString и QMap) и в драйверах SQL делают использование приложений для работы с базами данных Qt 4 более быстрыми.
Для получения более полной информации о модуле смотрите обзор QtSql.
Самый простой способ отображения информации базы данных - это скомбинировать QSqlQueryModel и QTableView:
QSqlQueryModel model; model.setQuery("select * from person"); QTableView view; view.setModel(&model); view.show();
Для представления содержимое единственной таблицы, мы можем взамен использовать QSqlTableModel:
QSqlTableModel model; model.setTable("person"); model.select(); QTableView view; view.setModel(&model); view.show();
На практике мы чаще всего должны настроить представление полей базы данных. В этом случае мы можем создать собственную модель представления, основанную на QSqlQueryModel. В следующем примере показана модель, которая подставляет '#' в значение поля 0 и преобразует значение в поле 2 к верхнему регистру:
class CustomSqlModel : public QSqlQueryModel { Q_OBJECT public: CustomSqlModel(QObject *parent = 0); QVariant data(const QModelIndex &item, int role) const; }; QVariant CustomSqlModel::data(const QModelIndex &index, int role) const { QVariant value = QSqlQueryModel::data(index, role); if (value.isValid() && role == Qt::DisplayRole) { if (index.column() == 0) return value.toString().prepend("#"); else if (index.column() == 2) return value.toString().toUpper(); } if (role == Qt::TextColorRole && index.column() == 1) return qVariantFromValue(QColor(Qt::blue)); return value; }
Можно также создать подкласс QSqlQueryModel для добавления поддержки редактирования. Это сделано с помощью новой реализации QAbstractItemModel::flags() для определения редактируемых полей и QAbstractItemModel::setData() для внесения изменений в базу данных. Здесь приведен пример setData(), переопределенной для изменения имени или отчества человека:
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() и setLastName(), которые выполняют update. Вот функция 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(); }
Дополнительные примеры можно найти в директории examples/sql.
Ядро классов работы с базами данных SQL не сильно изменилось по сравнению с Qt 3. Вот список основных изменений:
Классы для работы с базами данных, связанные с графическим интерфейсом пользователя, полностью перепроектированы. Абстракция QSqlCursor заменена на QSqlQueryModel и QSqlTableModel; QSqlEditorFactory заменён на QAbstractItemDelegate; QDataTable заменён на QTableView. Для облегчения перехода на Qt 4 старые классы оставлены в библиотеке Qt3Support.
[Предыдущая: Кроссплатформенные средства Qt 4 поддержки людей с ограниченными возможностями] [Начало] [Следующая: Модуль работы с сетью в Qt 4]
Copyright © 2008 Trolltech | Торговые марки | Qt 4.3.5 |