Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Отображение и редактирование данных таблиц с использованием подстановки для внешних ключей

Отображение и редактирование данных таблиц

Отображение результата запроса выборки в таблице

Пример использования модели данных, основанной на запросе:

 

1. QSqlQueryModel model;

2. model.setQuery("SELECT * FROM employee where salary > 50000");3. 4. QTableView *view = new QTableView;5. view-> setModel (model);6. view->show();

 

После установки запроса с использованием QSqlQueryModel::setQuery() вы можете использовать QSqlQueryModel::record(int) для доступа к отдельным аписям. Вы также можете использовать полиморфный метод QSqlQueryModel::data() и любой из других функций, унаследованных от класса QAbstractItemModel.

Также для использования доступна перегруженная версия функции setQuery(), принимающая объект типа QSqlQuery и оперирующая его результатом. Это позволяет использовать все возможности QSqlQuery для настройки запроса (например параметризованные запросы). ·

QSqlTableModel предоставляет возможность чтения и записи для одной таблицы. Пример использования модели данных, работающей с таблицей:

1. QSqlTableModel model;2. model. setTable ("employee");3. model. setFilter ("salary > 50000");4. model. setSort (2, Qt::DescendingOrder);5. model. select ();6. 7. QTableView *view = new QTableView;8. view-> setModel (model);9. view->show();

 

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

QSqlTableModel – высокоуровневая альтернатива QSqlQuery для навигации и изменения отдельных таблиц БД в коде. В результате ее применения получается меньше кода и не требуется знаний синтаксиса SQL.

Используйте QSqlTableModel::record() для получения строки таблицы и QSqlTableModel::setRecord() для изменения строки.

Например, код ниже увеличивает жалованье каждого сотрудника на 10 процентов:

1. for (int i = 0; i < model. rowCount (); ++i) 2. {3. QSqlRecord record = model.record(i);4. double salary = record.value("salary").toInt();5. salary *= 1.1;6. record.setValue("salary", salary);7. model.setRecord(i, record);8. }9. model.submitAll();

 

Вы также можете для доступа к данным использовать стандартные для всех моделей данных методы QSqlTableModel::data(), QSqlTableModel::setData(), QSqlTableModel::removeRows() (так как они унаследованы QAbstractItemModel).

· Пример добавления и изменения записей:

1. model. insertRows (row, 1);2. model. setData (model. index (row, 0), 1013);3. model. setData (model. index (row, 1), "Peter Gordon");4. model. setData (model. index (row, 2), 68500);5. model.submitAll();

 

Пример удаления пяти записей:

1. model. removeRows (row, 5);2. model.submitAll();

 

Первый аргумент QSqlTableModel::removeRows() является номером первой строки, второй количеством удаляемых записей.

Обратите внимание: После окончания изменения записей необходимо вызвать QSqlTableModel::submitAll(), которая гарантирует, что изменения записались в БД. Необходимость и время, когда необходимо вызвать submitAll(), зависят от текущей стратегии редактирования табличной модели: ·

1. enum EditStrategy 2. {3. OnFieldChange, // изм. применяются (сразу) при вводе значения 4. OnRowChange, // изм. применяются при обр. к другой строке (по умолч.)5. OnManualSubmit // изм. применяются только после вызова submitAll()6. };7. 8. EditStrategy editStrategy() const;9. void setEditStrategy (EditStrategy strategy);

 

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

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

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

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

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

1. model->setTable("employee");2. 3. model->setRelation(2, QSqlRelation("city", "id", "name"));4. model->setRelation(3, QSqlRelation("country", "id", "name"));

 

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

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

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

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

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

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

1. QTableView *view = new QTableView;2. view-> setModel (model);3. view->setItemDelegate(new QSqlRelationalDelegate(view));

 

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

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

qt




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 1488; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.