КАТЕГОРИИ: Архитектура-(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 процентов:
Вы также можете для доступа к данным использовать стандартные для всех моделей данных методы 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 для поддержки внешних ключей.
Вызов функции 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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |