Практика 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
7. На основе проекта scene01 выполните новую версию проекта Chess Board с возможностью перемещения шахматных фигур с помощью мыши. 8. Добавьте в проект scene01 возможность вывода координат перемещаемой мышью фигуры. 9. Создайте многомодульную программу с классами главного окна приложения и графической сценой.