- •1. Библиотека qt. Обзор.
- •2. Библиотека qt. Компоненты библиотеки qt.
- •3. Библиотека qt. Простое приложение на qt.
- •4. Библиотека qt. Слоты и сигналы.
- •5. Библиотека qt. Компоновка виджетов.
- •6. Библиотека qt. Управление компоновкой. Абсолютное позиционирование.
- •7. Библиотека qt. Управление компоновкой. Собственный алгоритм.
- •10. Библиотека qt. Управление компоновкой. Разделители.
- •8. Библиотека qt. Управление компоновкой. Менеджеры компоновки.
- •9. Библиотека qt. Управление компоновкой. Стековая компоновка.
- •11. Библиотека qt. Обработка событий.
- •12. Библиотека qt. Фильтры событий.
- •13. Библиотека qt. Обработка событий во время продолжительных процессов.
- •14. Библиотека qt. Работа с бд. Драйверы бд.
- •15. Библиотека qt. Работа с бд. Выполнение запросов к бд (qSqlQuery).
- •16. Библиотека qt. Работа с бд. Модели для работы с бд (qSqlTableModel).
- •17. Библиотека qt. Работа с бд. Связь модели qSqlTableModel с виджетом qTableView.
- •18. Графический интерфейс пользователя. Общие понятия, виды интерфейсов.
- •19. Графический интерфейс пользователя. Классификация интерфейсов.
- •20. Графический интерфейс пользователя. Командный интерфейс.
- •21. Графический интерфейс пользователя. Wimp(оому) интерфейс.
- •22. Графический интерфейс пользователя. Silk(рояз) интерфейс.
- •23. Графический интерфейс пользователя. Эргономика.
- •24. Графический интерфейс пользователя. Когнетика и локус внимания.
- •25. Графический интерфейс пользователя. Кратковременная память пользователя.
- •26. Графический интерфейс пользователя. Долговременная память пользователя.
- •27. Графический интерфейс пользователя. Формирование привычек.
- •28. Графический интерфейс пользователя. Одновременное выполнение задач.
- •29. Критерии качества графического интерфейса пользователя. Скорость выполнения работы.
- •30. Критерии качества графического интерфейса пользователя. Непосредственное манипулирование.
- •31. Критерии качества графического интерфейса пользователя. Потеря фокуса внимания.
- •32. Критерии качества графического интерфейса пользователя. Длительность физических действий.
- •33. Критерии качества графического интерфейса пользователя. Кнопка бесконечного размера.
- •34. Критерии качества графического интерфейса пользователя. Нулевая дистанция до кнопки.
- •36. Критерии качества графического интерфейса пользователя. Количественный анализ интерфейса(goms).
- •37. Критерии качества графического интерфейса пользователя. Человеческие ошибки.
- •38. Критерии качества графического интерфейса пользователя. Природа человеческих ошибок.
- •39. Критерии качества графического интерфейса пользователя. Типы человеческих ошибок.
- •40. Критерии качества графического интерфейса пользователя. Предотвращение человеческих ошибок.
- •41. Критерии качества графического интерфейса пользователя. Блокировка опасных действий пользователя.
- •42. Критерии качества графического интерфейса пользователя. Проверка системой действий пользователя перед их исполнением.
- •43. Критерии качества графического интерфейса пользователя. Самостоятельный выбор команд и параметров системой.
- •44. Критерии качества графического интерфейса пользователя. Обучение работе с системой.
- •45. Критерии качества графического интерфейса пользователя. Ментальная модель системы.
- •46. Критерии качества графического интерфейса пользователя. Аффорданс, метафора.
- •47. Критерии качества графического интерфейса пользователя. Обучающие материалы.
- •48. Критерии качества графического интерфейса пользователя. Субъективное удовлетворение.
- •49. Критерии качества графического интерфейса пользователя. Эстетика и красота в интерфейсе.
- •50. Критерии качества графического интерфейса пользователя. Субъективность восприятия времени.
- •51. Критерии качества гип. Сообщения об ошибках.
- •52. Гип. Модели графического интерфейса пользователя.
- •53. Проектирование гип. Обзор основных этапов разработки.
- •54. Проектирование гип. Определение необходимой функциональности системы.
- •55. Проектирование гип. Создание пользовательских сценариев.
- •56. Проектирование гип. Проектирование общей структуры.
- •57. Проектирование гип. Конструирование отдельных блоков.
- •58. Проектирование гип. Создание глоссария.
- •59. Проектирование гип. Сборка и начальная проверка полной схемы системы.
- •60. Проектирование гип. Построение прототипа.
- •61. Проектирование гип. Тестирование и модификация прототипа.
16. Библиотека qt. Работа с бд. Модели для работы с бд (qSqlTableModel).
Класс QSqlTableModel предоставляет редактируемую модель данных для одной таблицы базы данных.
QSqlTableModel - это высокоуровневый интерфейс к записям одной таблицы базы данных с возможностью и чтения и записи. Он является надстройкой нижнего уровня QSqlQuery и может быть использован, чтобы предоставлять данные для классов представлений, таких как QTableView. Например:
QSqlTableModel *model = new QSqlTableModel;
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->removeColumn(0); // don't show the ID
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
Мы устанавливаем имя SQL таблицы и стратегию редактирования, затем мы устанавливаем метки отображаемые в заголовках представления. Стратегия редактирования предписывает, когда изменения сделанные пользователем в представлении применяются в базе данных. Возможные значения стратегии - это OnFieldChange, OnRowChange и OnManualSubmit.
QSqlTableModel может быть также использован для доступа к базе данных программно, без связывания ее с представлением:
QSqlTableModel model;
model.setTable("employee");
QString name = model.record(4).value("name").toString();
Фрагмент кода выше извлекает поле salary из четвёртой записи, выбранной по запросу SELECT * from employee.
Имеется возможность установить фильтры, используя setFilter(), или изменить порядок сортировки с помощью setSort(). В конце вы должны вызвать select(), чтобы заполнить модель данными.
QSqlTableModel не предоставляет непосредственную поддержку внешних ключей. Если вы хотите разрешить внешние ключи, используйте QSqlRelationalTableModel и QSqlRelationalDelegate.
Драйвер QSQLITE блокирует обновления до тех пор, пока не выполнены все выборки. QSqlTableModel доставляет данные (QSqlQuery::fetchMore()) в необходимом виде; это может приводить к обновлениям по тайм-ауту.
17. Библиотека qt. Работа с бд. Связь модели qSqlTableModel с виджетом qTableView.
Классы QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel могут использоваться в качестве источников данных для классов представлений Qt, таких как QListView, QTableView и QTreeView. На практике наиболее часто используется QTableView в связи с тем, что результирующая SQL выборка, по существу, представляет собой двумерную структуру данных.
В следующем примере создается представление основанное на модели данных SQL:
QTableView *view = new QTableView; view->setModel(model);
view->show();
Если модель является моделью для чтения-записи (например, QSqlTableModel), то представление позволяет редактировать поля. Вы можете отключить это с помощью следующего кода
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
Вы можете использовать одну и ту-же модель в качестве источника данных для нескольких представлений. Если пользователь изменяет данные модели с помощью одного из представлений, другие представления немедленно отобразят изменения.
Классы-представления для обозначения колонок наверху отображают заголовки. Для изменения текста заголовка, вызовите setHeaderData() модели. Текстом заголовка по умолчанию является наименование поля. Например:
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));
QTableView также имеет вертикальные заголовки слева, содержащие номера строк. Если вы программно вставляете строки с помощью QSqlTableModel::insertRows(), новые колонки будут обозначены звездочкой (*) до тех пор, пока они не будут помещены в базу данных с помощью submitAll() или автоматически при переходе пользователя к другой записи (если стратегия редактирования равна QSqlTableModel::OnRowChange).
Аналогично, если вы удаляете строки с помощью removeRows(), они будут отмечены восклицательным знаком (!), пока изменения не будут внесены в базу данных.
Элементы представления отображаются с помощью делегата. Делегат по умолчанию QItemDelegate содержит большинство общих типов данных (int, QString, QImage и т.д.). Также делегат отвечает за предоставление виджета-редактора (например, combobox), когда пользователь начинает редактировать элемент представления. Вы можете создавать свои собственные делегаты, наследуя QAbstractItemDelegate или QItemDelegate. Для получения более подробной информации смотрите Программирование с помощью модели/представления.
QSqlTableModel оптимизирован для работы с одной таблицей в один момент времени. Если Вам нужна модель для чтения-записи, которая может работать с произвольной результирующей выборкой, вы можете создать подкласс QSqlQueryModel и переопределить flags() и setData() для возможности осуществлять чтение-запись. Две следующие функции делают поля 1 и 2 модели SQL запроса редактируемыми:
Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index)
{ Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable; return flags; }
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() определяется следующим образом:
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(); }
Функция setLastName() является подобной. Полный код реализации можно посмотреть в примере Query Model.
Создание подклассов модели делает возможной настройку собственной модели различными способами: вы можете предоставить подсказки к элементам, изменить цвет фона, отобразить вычисляемые значения, разрешать различным значениям быть отображенными и отредактированными, отдельно обработать нулевые значения и т.д. Для получения более подробной информации смотрите Программирование модель/представление и описание класса QAbstractItemView.
