Qt:Документация 4.3.2/qt4-sql

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[Предыдущая: Кросплатформенные средства Qt 4 поддержки людей с ограниченными возможностями ] [ Начало ] [Следующая: Модуль работы с сетью в Qt 4 ]

Содержание

[править] Поддержка GUI баз данных в Qt 4

Прослойка GUI SQL-модуля Qt 4 была полностью перепроектирована для работы с Interview (новые классы модель/представление Qt). Модуль состоит из трех основных классов ( QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel), которые хорошо работают с классами представлений Qt, особенно с QTableView.

[править] Общий Обзор

SQL-классы Qt 4 разделены на три слоя:

  • Драйвера баз данных
  • Классы ядра SQL
  • Классы GUI

Драйвера баз данных и классы ядра SQL, в основном, сохранились с Qt 3. Модели записей баз данных изменились Qt 4; теперь они наследуют QAbstractItemModel и облегчают представление информации базы данных в классах отображения, таких как QListView, QTableView и QTreeView.

Основная идея SQL-модуля Qt 4 заключается в том, что отображать и редактировать информацию базы данных должно быть также легко, как и любую другую информация, основанную на записях. Изменяя модель данных во время выполнения, вы можете решать, в каком виде сохранять информацию: в базе данных SQL или, скажем, в файле XML. Этот основной подход имеет еще одно дополнительное преимущество - вы ничего не обязаны знать о SQL для того, чтобы отображать и редактировать данные.

SQL-модуль Qt 4 включает в себя три модели записей:

  • QSqlQueryModel - модель только для чтения основанная на произволных SQL-запросах.
  • QSqlTableModel - модель чтения-записи допускающая работу только с одной таблицей.
  • QSqlRelationalTableModel - подкласс QSqlTableModel, поддерживающий внешние связи таблиц.

В комбинации с классами-представлениями Qt's и классом-делегатом по умолчанию ( QItemDelegate) модели Qt, классы работы с базами данных предлагают очень мощный механизм доступа к информации. Для большей гибкости отображения полей записи, вы можете создавать классы-наследники предопределенных классов, а для более полного контроля наследовать даже QAbstractItemDelegate или QItemDelegate.

Также можно изменять некоторые параметры без создания классов-наследников. Например, вы можете сортировать таблицу, используя QSqlTableModel::sort(), а создавать новые строки, осуществив соединение с сигналом QSqlTableModel::primeInsert().

Одна полезная особенность поддержанная моделью чтения-записи - это то, что возможно выполнять изменения записей без того, чтобы эти изменения попали в базу данных, пока не вызвана QSqlTableModel::submitAll(). Изменения можно отменить, вызвав QSqlTableModel::revertAll().

Многие классы выгодно отличаются от GUI 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();

To present the contents of a single table, we can use QSqlTableModel instead:

 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 &amp;firstName)
 {
     QSqlQuery query;
     query.prepare("update person set firstname = ? where id = ?");
     query.addBindValue(firstName);
     query.addBindValue(personId);
     return query.exec();
 }

Дополнительные примеры можно найти в директории examples/sql.

[править] Сравнение с Qt 3

Ядро классов работы с базами данных SQL не сильно изменилось по сравнению с Qt 3. Вот список основных изменений:

  • QSqlDatabase теперь реализован на основе значений, а не указателей.
  • QSqlFieldInfo и QSqlRecordInfo были объединены с QSqlField и QSqlRecord.
  • Генерация SQL-запросов перемещена в драйверы. Это позволяет использовать нестандарные SQL-расширения. Также это позволяет работать с не-SQL базами данных.

Классы для работы с базами данных, связанные с GUI, полностью перепроектированы. Абстракция QSqlCursor заменена на QSqlQueryModel и QSqlTableModel; QSqlEditorFactory заменён на QAbstractItemDelegate; QDataTable заменён на QTableView. Для облегчения перехода на Qt 4 старые классы оставлены в библиотеке Qt3Support.

[Предыдущая: Кросплатформенные средства Qt 4 поддержки людей с ограниченными возможностями ] [ Начало ] [Следующая: Модуль работы с сетью в Qt 4 ]



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2