Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

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

Поддержка GUI Баз Данных в Qt 4

Прослойка GUI 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'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();

Для отображения информации из единственной таблицы можно использовать 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();
    }

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

Сравнение с Qt 3

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

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

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


Copyright © 2005 Trolltech Trademarks
Qt 4.1.0
Hosted by uCoz