Прикладное программирование

Практика 31

Рефакторинг прикладного ПО

Графический стек фреймворка Qt: 
QGraphicsScene, QGraphicsView, QGraphicsItem

Для каждой программы, состоящей из нескольких файлов, 
создавайте отдельную папку проекта, например project31-1, 
project31-2 и т.д., где "31" - номер практического 
занятия, 1, 2 и т.д. - номер задания.
Каждую программу, состоящую из одного файла, сохранять 
в отдельном файле для каждого упражнения, 
например prog31-1, prog31-2 и т.д., где "31" - номер практического 
занятия, 1, 2 и т.д. - номер задания.

Задание 1. Выполните рефакторинг приложения, 
в котором используется API Yandex Maps.
Файлы index.htm из проекта yapanorama03.
Программный модуль
Версия 1.
Версия 2.
Версия 3.
Версия 4.
Версия 5.
К версии 4 добавьте строки из проекта yapanorama03.
Перед каждой добавленной строкой вставьте комментарии
"// New in v0.5"

Задания к версии 1.
Выполните отладку 1-й версии приложения, 
убедитесь, что выполнение происходит без ошибок.

Задания к версии 2.
Выполните рефакторинг 1-й версии, добавив необходимые 
фрагменты кода из 2-й версии.
Выполните отладку 2-й версии приложения, 
убедитесь, что выполнение происходит без ошибок. 
В отчете запишите, какие изменения внесены в предыдущую версию. 
Создайте сниппет с помощю сервиса codepen.io, или подобного ему, 
в код сниппета внесите комментарии, в начале кода добавьте комментарии, 
в которых укажите, какие новые функции, возможности добавлены 
при рефакторинге, какие прежние фрагменты кода были удалены. 
Ссылку на сниппет опубликуйте в комментариях к блогу. 
Блог
1. По примеру 45 из лекции создайте приложение проекта jsfile02. Напишите программу на языке JavaScript, в которой при нажатии на кнопку Open открывается с помощью диалогового окна текстовый файл. Данные из файла выводятся в Web-документ. 2. По примеру 44 из лекции создайте приложение проекта yapanorama03. Напишите программу на языке JavaScript с применением библиотеки API Yandex maps, которая позволяет отображать панораму локации с помощью сервисов Яндекс карты и Яндекс панорама по заданному маршруту в виде массива координат, географическим широтам и долготам. Передвижение по маршруту в плеере пановрам выполняется с помощью навигационной панели, собранной из вертикального ряда гиперссылок Back, Next, Reset, Set Max, Show Item. Информация о состоянии навигации выводится в теле web-документа. 3. По примерам 39 и 45 из лекции выполните интеграцию двух программных модулей проектов jsarray03 и jsfile02 в один моудуль, в котором из текстового файла загружаются числа в двумерный массив, а затем навигационная панель позволяет последовательно выводить элементы массива в html-документе и в консоли. 4. По примерам 39, 42 и 45 из лекции выполните интеграцию трех программных модулей проектов jsarray03, jstimer01 и jsfile02 в один моудуль, в котором есть кнопки: 1) Back, Next, Reset, Set Max, Show Item; 2) Open для загрузки элементов массива из файла; 3) Start для запуска автоматической навигации по элементам массива; 4) Stop для остановки навигации по элементам массива; 5) Pause для приостановки навигации по элементам массива. Анимация выполняетсяпо таймеру с помощью функции setInterval(). 5. В условия предыдущей задачи внесены изменения: вместо модуля проекта jstimer01 интегрируется модуль из проекта jstimer02, т.е. анимация выполняется с помощью рекурсивного вызова функции setTimeout(). 6. На основе проекта scene01 создайте приложение, в котором проиллюстрированы возможности графического стека фреймворка Qt: вывод графических примитивов, текста, растровых графических файлов с поддержкой прозрачности, технологии Drag&Drop и т.п. Пример 1. // main.cpp #include <QApplication> #include <QtGui> #include <QGraphicsScene> #include <QGraphicsView> QGraphicsScene scene; int main(int argc, char *argv[]) { QApplication app(argc, argv); QGraphicsScene scene; scene.setBackgroundBrush(Qt::black); QGraphicsView view(&scene); view.resize(600, 600); // view.rotate(-45); view.show(); QPen redPen( Qt::red, 12, Qt::DashDotLine, Qt::RoundCap); QPen blackPen( Qt::black, 8, Qt::SolidLine, Qt::RoundCap); QPen cyanPen( Qt::cyan, 8, Qt::SolidLine, Qt::RoundCap); QPen yellowPen( Qt::yellow, 5, Qt::SolidLine, Qt::RoundCap); QBrush redBrush( Qt::red, Qt::SolidPattern); QBrush greenBrush( Qt::green, Qt::SolidPattern); QBrush blueBrush( Qt::blue, Qt::SolidPattern); QGraphicsLineItem *xLineItem = scene.addLine( -300, 0, 300, 0, yellowPen); QGraphicsLineItem *yLineItem = scene.addLine( 0, -300, 0, 300, redPen); QGraphicsRectItem *redRectItem = scene.addRect( -200, -100, 200, 100, cyanPen, redBrush); QGraphicsRectItem *greenRectItem = scene.addRect( 0, -100, 200, 100, cyanPen, greenBrush); QGraphicsRectItem *blueRectItem = scene.addRect( -200, 0, 200, 100, cyanPen, blueBrush); QString filePath = "C:\\3kurs\\scene01\\images\\sky-01.png"; QPixmap myPixmap; myPixmap.load(filePath); QGraphicsPixmapItem *pixmapItem = scene.addPixmap(myPixmap); pixmapItem->setOffset(0, -300); pixmapItem->setFlag(QGraphicsItem::ItemIsMovable); pixmapItem->setFlag(QGraphicsItem::ItemIsSelectable); QGraphicsTextItem *textItem = scene.addText("Test QGrapicsScene!", QFont("Courier", 32, QFont::Bold)); textItem->moveBy(-300, 0); textItem->setFlag(QGraphicsItem::ItemIsMovable); textItem->setFlag(QGraphicsItem::ItemIsSelectable); // textItem->setHtml("<a href=\"http://yandex.ru\" style=\"color:green;\">Yandex"); // textItem->setDefaultTextColor(Qt::transparent); textItem->setDefaultTextColor(Qt::color0); return app.exec(); } void QGraphicsScene::dragMoveEvent ( QGraphicsSceneDragDropEvent * event ) { update(); } //void QGraphicsItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) void QGraphicsScene::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) { update(); }

Презентации к лекциям в Google Play
LOGO

7. На основе проекта scene01 выполните новую версию проекта 
Chess Board с возможностью перемещения шахматных фигур с помощью мыши. 

8. Добавьте в проект scene01 возможность вывода координат 
перемещаемой мышью фигуры. 

9. Создайте многомодульную программу с классами главного окна приложения 
и графической сценой. 


Источники

Основные

  1. Юркин А. Г. Задачник по программированию. — СПб.: Питер, 2002. — 192 с.
  2. Поляков К. Ю., Шестаков А. П., Еремин Е. А. Объектноориентированное программирование // Информатика. — 2011. — N13. — С. 22-45.
  3. Qt Downloads qt-win-opensource-4.1.1-mingw.exe
  4. Qt Downloads qt-opensource-windows-x86-mingw482-4.8.7.exe
  5. arduino.cc: Download the Arduino IDE Arduino 1.8.5 Windows ZIP file for non admin install
  6. forum.amperka.ru: Arduino Mega 2560 + CH340 Установка Драйвера Windows 7 x64.
  7. wch.cn: CH341SER.ZIP

Дополнительные

  1. doc.crossplatform.ru/qt: Каркас графического представления: QGraphicsScene, QGraphicsItem, QGraphicsView.
  2. evileg.com: Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью.
  3. evileg.com: Qt/C++ - Урок 018. QGraphicsItem - наследование и СЛОТы.
  4. intuit.ru: Лекция 11: Знакомство с Qt. Подготовка к работе.
  5. itnotesblog.ru: Drag&Drop в Qt: Перемещаем изображения и текст.
  6. itnotesblog.ru: OpenCV: Установка и использование под Windows.
  7. itnotesblog.ru: Паттерн MVC на примере Cапера.
  8. itnotesblog.ru: Паттерн Состояние на C++.
  9. cppstudio.com: Первая программа на Qt.