Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование БД.docx
Скачиваний:
74
Добавлен:
08.03.2016
Размер:
712.24 Кб
Скачать
        1. Отображение и редактирование данных таблиц с использованием подстановки для внешних ключей

QSqlRelationalTableModel расширяет QSqlTableModel, обеспечивая поддержку внешних ключей.

Пример на рисунке 0 показывает различие вы представлении информации табличной модели и модели с поддержкой внешних ключей.

Рисунок 0 – Сравнение представлений, использующих QSqlTableModel и QSqlRelationalTableModel

Верхний снимок окна показывает простую QSqlTableModel, загруженную в представление (виджет QTableView). Внешние ключи (cityиcountry) не заменены на читаемые человеком значения.Нижний снимок показывает QSqlRelationalTableModel с внешними ключами, замененными читаемыми человеком текстовыми значениями, взятыми из словарей.

Следующий фрагмент кода показывает, как настроить QSqlRelationalTableModel для поддержки внешних ключей.

  1. model->setTable("employee");

  2. model->setRelation(2, QSqlRelation("city", "id", "name"));

  3. model->setRelation(3, QSqlRelation("country", "id", "name"));

Вызов функции setRelation() устанавливает взаимосвязь между двумя таблицами (в контексте модели данных).

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

Делегаты– это объекты классов унаследованных от QAbstractItemDelegate, предназначенные для отображения и редактирования данных из моделей в виджетах-представлениях. Например, поле ввода, появляющееся в ячейке виджета-таблицы при изменении значения в этой ячейке. Определение собственного класса делегатов и переопределение соответствующих полиморфных (виртуальных функций) позволяет организовать особый режим редактирования и отображения данных в представлениях (пример на рисунке 0).

Рисунок 0 – Пользовательские делегаты в действии

В отличие от делегата по умолчаниюQSqlRelationalDelegate предоставляет выпадающий список для редактирования внешних ключей.

Для использования класса всего лишь необходимо вызвать функцию QAbstractItemView::setItemDelegate() для представления, передав ей экземпляр QSqlRelationalDelegate в качестве параметра, как показано в примере:

  1. QTableView *view = new QTableView;

  2. view->setModel(model);

  3. view->setItemDelegate(new QSqlRelationalDelegate(view));

Рисунок 0 иллюстрирует использование QSqlRelationalDelegate в представлении.

Рисунок 0 – Пользовательские делегаты в действии

        1. Связь элементов данных с обычными виджетами

qt

        1. Настройка собственной модели данных

qt