
- •1. Библиотека qt. Обзор.
- •2. Библиотека qt. Компоненты библиотеки qt.
- •3. Библиотека qt. Простое приложение на qt.
- •4. Библиотека qt. Слоты и сигналы.
- •5. Библиотека qt. Компоновка виджетов.
- •6. Библиотека qt. Управление компоновкой. Абсолютное позиционирование.
- •7. Библиотека qt. Управление компоновкой. Собственный алгоритм.
- •8. Библиотека qt. Управление компоновкой. Менеджеры компоновки.
- •9. Библиотека qt. Управление компоновкой. Стековая компоновка.
- •10. Библиотека 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. Проектирование гип. Тестирование и модификация прототипа.
11. Библиотека qt. Обработка событий.
Переопределение обработчиков событий.
В QT событие (event) — это экземпляр подкласса QEvent. QT обрабатывает более сотни типов событий, каждое из которых идентифицируется определенным значением перечисления.
Пример:QEvent::type() - определение, какой тип события произошел.
QEvent::MouseButtonPress.
По щелчку по изображению оно отображается в полноэкранном режиме.
Для событий некоторых типов недостаточно тех данных, которые могут хпаниться в простом объекте QEvent. Эта информация хранится в определенных одклассах QEvent.
События уведомляют объекты о себе при помощи функции event(), унаследованной от класса QObject. Реализация event QWidget передает больштнство событий конкретным обработчикам событий.
Рассмотрим обработку событий на примере событий клавиатуры:
События клавиатуры обрабатываются путем переопределения функции keyPressEvent(), keyReleaseEvent(). Если зажать кнопку — получаем много пресс без релиз.
Пример:
void CodeEditor::KeyPressEvent(QKeyEvent *event) { switch(event) { case Qt::Key_Home: if(event->modifiers() & Qt::ControlModifier) { goToBeginOfDocument(); } else { goToBeginLine() } } default: QWidget::keyPressEvent(event); }
Важно — наличие default.
bool CodeEditor::event(QEvent *event) { if(event->tupe()==QEvent::KeyPress) { QKeyEvent *keyEvent=static_cast<QKeyEvent*>event; if(keyEvent->key==Qt::Key_Tab) { insertAtCurrentPosition('\t'); return true; } } return QWidget::event(event); }Если вместо true передать false событие передастся родителю.
12. Библиотека qt. Фильтры событий.
Фильтр событий позволяет одному объекту класса QObject перехватывать события другого объекта класса QObject еще до того, как они дойдут до последнего.
Рассмотрим пример передачи фокуса от одного поля ввода к другому.
Необходимо вначале сообщать виджету, что его события будут перехватываться.
MyClass::eventFilter(QObject *target,QEvent *event) { if(target==firstNameEdit || target==lastNameEdit || target==cityEdit || target==phoneEdit) { if(event->type()==QEventKeyPress) { QKeyEvent *keyEvent=static_cast<QKeyEvent*>event; if(keyEvent->key()==Qt::Key_Space) { focusNextChild(); return true; } } } return QDialog::eventFilter(target,event); }
События многих типов могут передаваться дальше по системе объектов приложения, если событие не было обработано ни на пути к целевому объекту, ни самим целевым объектом, то процесс обработки повторяется, но теперь в качестве целевого объекта используется родительский виджет. Этот процесс продолжается: управление передается от одного радительского объекта другому до тех пор, пока событие либо не будет обработано. Либо не достигнет верхнего уровня.
13. Библиотека qt. Обработка событий во время продолжительных процессов.
Цикл обработки событий начинается с вызова метода QApplication::exec();
При запуске приложения QT генерирует несколько событий для отображения виджетов на экране. После этого запускается цикл обраотки событий. В процессе обработки могут генерироваться другие события, которые ставятся в конец очереди событий. Если очень много времмени уходит на обрабоотку одного события, то интерфейс становится невосприимчив к действиям пользователя.Для обработки длительных действий можно использовать QApplication::processEvent(). Данная функция говорит QT о необходимости обработки ожидающих событий, находящихся в очереди и затем возвращает управление функции, вызвавшей ее.
void ImageView::SaveImage(Color image){ SaveImageHeader(imgHeader); for(int i=0;i<imgHeader.height;i++) { for(int j=0;j<imgHeader.width;i++) { out<<image[imageHeader.width*i+j]; } qApp->processEvent(); }}
При использовании этого метода существует опасность того, что пользователь может закрыть главное окно или повторно вызвать операцию сохранения. qApp->processEvent(QEventLoop::ExcludeUserInputEvents); - исключает события ввода пользователя.Часто при ввыполнении длительных процессов пользователю демонстрируется состояние при помощи виджета QProgressDialog.
QProgressDialog process(this); process.setLabelText(tr("Save Image")); process.setRange(0, imageHeader.height); process.setModal(true);
Для проверки, что была нажата отмена испольщзуется метод:
if(process.wasCanceled()) { out.remove(); return; }
Существует так же другой способ работы с длительными процессами.
… Вместо того, чтобы начать выполнение операции по запросу пользователя данная операция откладывается до перехода приложения в состояние ожидания. Такая обработка применима к операциям, которые легко прервать и возобновить. В QT это реализуется при помощи ноль-милисекундного таймера. Таймер токого типа работает при отсутствии ожидающих событий.
void ImageView::timerEvent(QTimerEvent *event) { if(event->timerId()==myTimerID) { while(step<maxStep && !qApp->hasPendingEvents()) { performerStep(step); step++; } } else { QDialog::timerEvent(event); }}