Министерство образования и науки РФ Федеральное государственное бюджетное образовательное учреждение

advertisement
Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
Волгоградский государственный технический университет
(ВолгГТУ)
Кафедра «Программное обеспечение автоматизированных систем»
Формализация задачи
Выполнили:
студенты гр. ИВТ-461
Божко С.Н.
Линьков А.В.
Проскуряков С.С.
Проверили:
Жукова И.Г.
Ужва А.Ю.
Волгоград 2011
СОДЕРЖАНИЕ
Постановка задачи ................................................................................................... 3
Цели и задачи проекта .......................................................................................... 10
Область и объект проектирования ....................................................................... 10
Функциональные требования............................................................................... 11
Нефункциональные требования .......................................................................... 13
Рамки и ограничения ............................................................................................ 13
Макеты экранных форм ........................................................................................ 18
Разработка концепции программы, выбор технологии ..................................... 19
Приложение А. USE-CASE диаграмма ............................................................... 21
Приложение Б. Объектная модель. ...................................................................... 22
Приложение В. Диаграмма классов..................................................................... 23
Приложение Г. Диаграмма иерархии классов .................................................... 24
Приложение Е. Сценарий тестирования ............................................................. 25
Приложение Ж. Сценарий работы программы .................................................. 29
Приложение З. Фрагмент кода программы ......................................................... 38
2
ПОСТАНОВКА ЗАДАЧИ
ВАРИАНТ 6: ДИАГРАММА РАЗВЕРТЫВАНИЯ
Основные элементы, которые должны быть реализованы в проекте:
Узлы, устройства, среды выполнения, в том числе включаемые друг в друга:
Информационные потоки
Перетаскивание родительского объекта обязано так же переносить и
дочерние (вложенные) объекты.
Компоненты
Комментарии:
— Свободные
— К элементам диаграммы
Должна быть реализована дескрипторная форма диаграммы развертывания с
отношением зависимости между узлами в соответствии с UML 2.0.
Диаграмма развертывания проецирует программную архитектуру,
созданную при проектировании, на исполняющую ее физическую
архитектуру системы. В распределенных системах она моделирует
распределение программного обеспечения по физическим узлам. [Арлоу Д.,
Нейштадт И. UML 2 и Унифицированный процесс. Практический объектноориентированный анализ и проектирование, 2-е издание. – Пер. с англ. –
СПб: Символ-Плюс, 2007. – 624 с., ил., с. 514]
3
Кроме соединений на диаграмме развертывания могут присутствовать
отношения зависимости между узлами. Подобный способ является
альтернативой изображению вложенных элементов внутри символа узла, что
не всегда удобно, поскольку делает этот символ излишне объемным.
[Леоненков А.В. Самоучитель UML. – 2-е изд., перераб. и доп.- СПб.: БХВПетербург, 2004. – 432 с.: ил.]
Элементы диаграммы, согласно варианту:
1) Узел:
[OMG UML. Superstructure. Version 2.4.1, с. 208]
Спецификация UML 2.0 [UML2S] гласит: «Узел представляет тип вычислительного ресурса, на который могут быть развернуты артефакты для
выполнения». [Арлоу Д., Нейштадт И. UML 2 и Унифицированный процесс.
Практический объектно-ориентированный анализ и проектирование, 2-е
издание. – Пер. с англ. – СПб: Символ-Плюс, 2007. – 624 с., ил., с. 515]
2) Узел-устройство: аналогично узлу выше с указанием стереотипа
<<device>>
[OMG UML. Superstructure. Version 2.4.1, с. 213]
Устройство (device) – это физическое оборудование: компьютер или
устройство, связанное с системой. [Фаулер М. UML. Основы, 3-е издание. –
Пер. с англ. – СПб: Символ-Плюс, 2004. – 192с., ил., с.121]
3) Узел-среда выполнения: аналогично узлу выше с указанием
стереотипа <<executionEnvironment>>
4
[OMG UML. Superstructure. Version 2.4.1, с. 214]
Среда выполнения (execution environment) – это программное обеспечение,
которое само может включать другое программное обеспечение, например
операционную систему или процесс-контейнер. [Фаулер М. UML. Основы, 3е издание. – Пер. с англ. – СПб: Символ-Плюс, 2004. – 192с., ил., с.121]
4) Свободные комментарии и комментарии к элементам диаграммы:
5) Информационный поток и линия связи:
- информационный поток без информации
- информационный поток с информацией
- линия связи
[OMG UML. Superstructure. Version 2.4.1, с. 221]
Информационные пути между узлами представляют обмен информацией в
системе. Можно сопровождать эти пути информацией об используемых
информационных протоколах. [Фаулер М. UML. Основы, 3-е издание. – Пер.
с англ. – СПб: Символ-Плюс, 2004. – 192с., ил., с.122]
Кроме собственно изображений узлов на диаграмме развертывания
указываются отношения между ними. В качестве отношений выступают
физические соединения между узлами и зависимости между узлами и
компонентами, изображения которых тоже могут присутствовать на
диаграммах развертывания.
Соединения являются разновидностью ассоциации и изображаются
отрезками линий без стрелок. Наличие такой линии указывает на
5
необходимость организации физического канала для обмена информацией между
соответствующими узлами. [Леоненков А.В. Самоучитель UML. – 2-е изд.,
перераб. и доп.- СПб.: БХВ-Петербург, 2004. – 432 с.: ил.]
6) Узлы могут быть простые и составные:
[OMG UML. Superstructure. Version 2.4.1, c. 213]
<<device>>
AppServer
<<device>>
AppServer
<<executionEnvironment>>
J2EEServer
<<executionEnvironment>>
EJB Container
Oracle DBMS
Согласно нашему варианту
Название пункта
Описание
Стоимость
(баллы)
Привести
Сделать, чтобы все используемые
диаграмму в
графические элементы и примитивы
соответствие со
отображались визуально идентично тем,
стандартом UML
которые использованы в стандарте UML.
7
В качестве ссылки на стандарт возможно
использовать одну из известных книг по
UML при согласовании выбора с
6
преподавателем.
Набор элементов и возможностей должен
соответствовать заданию, выданному на 1-й
релиз.
Полнота реализации Программа должна на 100%
функциональных и
соответствовать функциям, заявленным к 1-
нефункциональных
му релизу:
требований
7
— набор элементов соответствует
требуемому;
— элементы могут быть вложены друг в
друга;
— между вложенными компонентами
должна быть реализована
возможность установки связей;
— вложенные компоненты должны быть
перетаскиваемы, пользователь должен
иметь возможность расположить их
произвольным образом в рамках
контейнера-родителя;
— реализованы функции
сохранения/загрузки в собственный
формат, экспорт в картинку;
— реализовано перемещение элементов
с использованием технологии Drag
and Drop;
— реализовано добавление, удаление
элементов на диаграмму;
— реализовано редактирование
7
текстовых свойств элементов;
— реализована активная область
выделения для связей не менее 7px
шириной;
— программа должна иметь
инсталлятор, запускаться на Windows
XP SP2/3, Windows 7.
Построить
Построить Deployment Diagram для вашей
7
Deployment Diagram программы в вашем редакторе.
для вашей
программы в вашем
Диаграмма должна соответствовать как
редакторе
стандарту, так и актуальной реализации
вашей программы.
Реализовать
Должны быть реализованы функции:
функции работы с
1) Выделение множества фигур мышкой и
буфером обмена
при помощи клавишCtrl/Shift аналогично
40
выделению файлов в «проводнике»
2) Копирование выделенных фигур в буфер
обмена
3) Вставка фигур из буфера обмена
4) Вырезать/Вставить фигуры
Буфер обмена должен работать в том числе
и между двумя копиями запущенной
программы.
Реализовать
При перетаскивании объекта с нажатой
«дублирование при
клавишей Alt он должен дублироваться и
перетаскивании»
перетаскиванию подвергаться его копия,
25
оставляя оригинальный объект на месте.
8
Пример — другие графические редакторы
(Visio и т.п.).
Реализовать
Реализовать функцию Undo/Redo на 1 шаг
функцию «отмена
для каждой из предусмотренных действий
последнего
над диаграммой
10
действия»
Реализовать
То же самое, что и в предыдущем пункте,
функцию «отмена
но на произвольное количество шагов (не
последних
менее 300)
40
действий»
- Связи родительских и дочерних элементов выглядят как пунктирная линия со
стрелкой
- Для всех элементов нужно, чтобы отображалось полное наименование, а для
комментария только 20 символом с троеточием в конце. При наведении на
комментарий будет показан полный текст
- Элементы не масштабируются.
- Наименования элементов могут быть на англ языке.
- При удалении элемента, связанного информационными потоками с другими
элементами и его удалении, удаляетя сам элемент и все связи.
- Элементы не обязаны иметь уникальное наименование
9
ЦЕЛИ И ЗАДАЧИ ПРОЕКТА
Сократить время на создание и редактирование диаграмм, аналогичных
UML-диаграммам типа Deployment Diagram. Графический редактор должен
обеспечить возможность создания, редактирования и сохранения диаграмм,
выполнять функции, описанные в разделе «Функциональные требования».
Для достижения поставленной цели был поставлен ряд следующих задач:
 Провести предпроектное исследование;
 Проанализировать варианты решения и выбрать основной;
 Реализовать проект согласно выбранному варианту;
 Протестировать полученное решение;
 Внедрить на предприятие заказчика.
ОБЛАСТЬ И ОБЪЕКТ ПРОЕКТИРОВАНИЯ
Использование
Объектное моделирование в области разработки программного обеспечения с
помощью графического редактора.
Объект проектирования
Создание диаграмм развертывания в соответствии с заданием заказчика.
Состав: элемент «узел»
элемент «устройство»
элемент «среда-выполнения»
элемент «информационный поток»
элемент «свободный комментарий»
10
элемент «связь свободного комментария и элемента»
элемент «комментарий к элементу диаграммы»
Структура:
Рис.1. Пример выходной диаграммы.
ФУНКЦИОНАЛЬНЫЕ ТРЕБОВАНИЯ
Действие
Объект
Ограничение
Главная функция
Создать
диаграмму
Основные функции
Открыть
диаграмму
из собственного формата
файла *.fde
Сохранить
диаграмму
в собственный формат
файла *.fde
Редактировать
Диаграмму
11
Добавить
- узел
1 элемент
- устройство
- среда выполнения
- информационный
поток
- линию связи
- комментарий
Удалить
элемент(ы)
Вспомогательные функции
Сохранить как
диаграмму
в собственный формат
файла *.fde
Экспортировать
диаграмму
в формат jpeg
диаграмму в jpeg
Печать диаграмму в файл диаграмма
Только на принтеры с
установленными
драйверами
Выделить множество
элементы
Плюс один выделенный
элементов при помощи
элемент за каждый левый
«Ctrl»
клик мыши
Копировать выделенные
элементы
Без ограничений
элементы
Без ограничений
элементы
Без ограничений
элементы
Одна отмена за один клик
программа
сохранить диаграмму
элементы в буфер обмена
Вставлять элементы из
буфера обмена
Дублировать элементы
при нажатой «Alt»
Отменять последние
действия
Выйти из программы
12
НЕФУНКЦИОНАЛЬНЫЕ ТРЕБОВАНИЯ
• Программа должна стабильно работать при системных требованиях:
компьютер с процессором не меньше 1.7 ГГц, 256 Мб оперативной
памяти, под управлением операционной системой Windows XP. Объем
свободного места на винчестере не должен быть менее 100 Мб.
• Программа должна обладать простым и удобным интерфейсом за счет
использования визуальных элементов и единого интерфейсного языка.
• Инсталлятор должен содержать все необходимые файлы, библиотеки
для корректной работы программы на компьютере пользователя,
работающем под управлением операционной системой Windows XP,
после ее установки.
РАМКИ И ОГРАНИЧЕНИЯ
Программный продукт должен быть окончательно реализован до 10 декабря.
Программа поддерживает работу не более одного пользователя
единовременно.
Интерфейс программного продукта имеет лишь один язык представления.
При возникновении нештатной ситуации, например, автоматический
перезапуск, отключение питания, программа отвечает только за сохраненные
пользователем данные.
Добавление узла, устройства, среды выполнения, комментария происходят в
пределах рабочей области.
Одновременно на рабочую рекомендуется добавлять не более 24 простых
элементов, а внутри одного устройства может быть 4 устройства/ узла
(связано с размерами программы при запуске (Рис. 2), а также с
13
возникающими дефектам отрисовки).
Рис. 2. Ограничения по количеству элементов
Функциональные рамки и ограничения:
Добавить узел:
При нажатии иконки Add node, на рабочей области появляется
параллелепипед (Рис. 3) с размерами 44х32 пикселей, именованный как Node.
Рис. 3. Узел
При нажатии кнопки Add Node при активном элементе создается сложный
14
узел (Рис. 4) со стандартными размерами.
Рис. 4. Сложный узел
Рекомендуемая длина наименования узла – до 10 символов.
Добавить устройство:
При нажатии иконки Add device, на рабочей области появляется
параллелепипед (Рис. 5) с размерами 44х32 пикселей, именованный как
Device.
Рекомендуемая длина наименования устройства – до 10 символов.
Рис. 5. Устройство
Добавить комментарий:
При нажатии иконки Add comment, на рабочей области появляется
четырёхугольник (Рис. 6) размерами 44х32 пикселей, именованный как
Comment.
Рекомендуемая длина наименования комментария – до 10 символов.
Рис. 6. Комментарий
15
Рекомендуемая длина комментария – до 60 символов.
Добавить среду-выполнения:
При нажатии иконки Add ExEnviroment, на рабочей области появляется
параллелепипед (Рис. 7) размерами 44х32 пикселей, именованный как
ExcutionEnviroment.
Рекомендуемая длина наименования элемента среда-выполнения – до 10
символов.
Рис. 7. Среда-выполнения
Рекомендуемая длина комментария – до 20 символов.
Добавить информационный поток:
При нажатии на один элемент (Узел, Устройство, Среда-выполнения), потом
на другой элемент (Узел, Устройство, Среда-выполнения) и нажатии иконки
Add information stream, оба элемента соединяются линией с наименованием
передаваемых данных (Some Stream Info) (Рис. 8), размерами 100х3 пикселей
при горизонтальном положении элементов и 3х27 пикселей при
вертикальном положении элементов (для приемлемой читаемости). При
перемещении одного из элементов, связанных потоком, линия связи должна
идти от ближайшей стороны элемента, не пересекая сам элемент.
16
Рис. 8. Информационный поток
Добавить линию связи:
При выделении двух элементов (Узел, Устройство, Комментарий, СредаВыполнения) и выборе иконки Add line, оба элемента соединяются линией
(Рис. 9). При перемещении одного из связанных элементов, линия связи
должна идти от ближайшей стороны элемента, не пересекая сам элемент.
Рис. 9. Линия связи
Удалить (Удаление элемента):
При выделении элемента и выборе иконки Delete, происходит удаление
элемента. Если удаляемый элемент был связан с другим линией связи или
информационным потоком, то происходит удаление элемента и линии связи
(информационного потока). Возможно одновременное удаление нескольких
элементов.
17
Создать (Создать новую диаграмму) и Открыть (Открыть диаграмму):
При выборе пункта New или Open меню File, пользователю предлагается
сохранить редактируемый проект.
Пример диаграммы, которая может быть построена в редакторе
Рис. 10. Диаграмма, которую можно построить с помощью данного
редактора.
МАКЕТЫ ЭКРАННЫХ ФОРМ
18
Рис. 10. Макет главного окна редактора.
Рис. 11. Макет диалогового окна
РАЗРАБОТКА КОНЦЕПЦИИ ПРОГРАММЫ, ВЫБОР ТЕХНОЛОГИИ.
Языки программирования и библиотеки.
С++, Qt 4.7.
Средства разработки.
19
Qt Creator 4.7.
Средства документирования.
Кроссплатформенная система документирования исходных текстов,
поддерживающая C++, Word.
Средства тестирования.
Ручное тестирование.
Средства командной разработки
Google code
Средства коммуникации.
e-mail
Skype.
20
ПРИЛОЖЕНИЕ А. USE-CASE ДИАГРАММА.
Главная:
Редактирование:
21
Экспорт:
Добавление элемента:
ПРИЛОЖЕНИЕ Б. ОБЪЕКТНАЯ МОДЕЛЬ.
22
ПРИЛОЖЕНИЕ В. ДИАГРАММА КЛАССОВ.
23
ПРИЛОЖЕНИЕ Г. ДИАГРАММА ИЕРАРХИИ КЛАССОВ.
24
ПРИЛОЖЕНИЕ Е. СЦЕНАРИЙ ТЕСТИРОВАНИЯ.
1. Начало работы
1.1Создание новой диаграммы. Новая диаграмма создается при запуске
программы.
1.2Загрузка диаграммы из файла. При выборе в меню «File» пункта
«Open» открывается окно выбора файла.
1.2.1 При выборе файла диаграммы открывается созданная ранее
диаграмма.
- Редактирование диаграммы
2.1Создание элемента диаграммы.
2.1.1. При выборе в меню пункта «Add node» создается элемент
«Node» на рабочей области.
2.2.
Создание связей между элементами.
2.2.1 При выделении любых двух элементов и выбора в меню
пункта «Add line» мы добавляем связь между этими двумя
выделенными элементами.
2.2.2 При выделении элемента на рабочей области и нажатии
кнопки «Add stream», и добавлении нового элемента
диаграммы между выделенным и добавленным элементом,
добавляется информационный поток.
2.3. Выделение элемента диаграммы.
2.3.1 При нажатии на элемент происходит его выделение, контуры
элемента прорисовываются более толстыми линиями.
2.3.2 При двойном нажатии на элемент появляется диалоговое окно
для изменения имени элемента или быстрого добавления в
него других элементов.
2.3.3 При нажатии на пустом пространстве рабочей области
выделение с объекта снимется.
2.4.
Удаление элемента диаграммы.
25
2.4.1 При выборе пункта «Delete» в меню, предварительно
выделенный элемент диаграммы или связь между элементами
удалится. Также вместе с элементом диаграммы удаляются все
связи относящиеся к нему.
2.5.
Перемещение элементов диаграммы.
2.5.1 Щелкнув и зажав левую клавишу мыши на любом элементе,
расположенном в рабочей области, при перемещении мыши,
перемещается соответствующий элемент.
2.5.2 При попытке переместить элемент за пределы рабочей
области элемент не выходит за ее пределы.
2.6.
Изменение имени элемента диаграммы.
2.6.1. При двойном нажатии на элемент появляется диалоговое окно
для изменения имени элемента в котором можно ввести имя и
переименовать выделенный элемент нажав кнопку «ОК» либо
отменить переименование, нажав кнопку «Cancel».
2.7.
Отмена последнего действия.
2.7.1. При совершении, какого либо действия, добавляющего или
изменяющего элементы диаграммы и выбора на панели
инструментов пункта “Undo” происходит отмена последнего
действия совершенного пользователем.
2.8.
Возврат отмененного действия.
2.8.1. При совершении, какого либо действия, добавляющего или
изменяющего элементы диаграммы и выбора на панели
инструментов пункта “Undo” происходит отмена последнего
действия совершенного пользователем. Если после этого на
панели инструментов выбрать пункт “Redo” произойдет возврат
отмененного действия.
2.9.
Вырезание элемента диаграммы.
2.9.1. При выделении элемента диаграммы и выбора на панели
инструментов пункта “Cut” происходит вырезание выделенного
26
элемента (элемент исчезает с рабочей области и добавляется в
буфер обмена).
2.10. Копирование элементов диаграммы.
2.10.1. При выделении элементов диаграммы и выбора на панели
инструментов пункта “Copy” происходит копирование
выделенных элементов (элементы остаются на рабочей области,
добавляются в буфер обмена).
2.11. Вставка элементов диаграммы.
2.11.1.
При выборе на панели инструментов пункта “Paste”
происходит вставка в рабочую область элементов предварительно
скопированных в буфер обмена.
3. Сохранение диаграммы в файл собственного формата
3.1 При выборе в меню «File» пункта «Save as» происходит вызов
диалогового окна для указания места сохранения файла.
3.1.1 После того как путь и имя файла были выбраны, нажимаем на
кнопку «Сохранить» и данные диаграммы записываются в
файл с тем именем, которое было указано в диалоговом окне.
3.1.2 Если файл с именем указанным в диалоговом окне
существует, появится сообщение с вопросом надо ли заменить
существующий файл.
3.1.2.1 Если согласиться, нажав кнопку «Да», файл будет
заменен.
3.1.2.2 Если не согласится, нажав кнопку «Нет», диалоговое
окно будет закрыто.
4. Экспорт диаграммы в графический файл
4.1 При выборе в меню «File» пункта «Export to jpeg» происходит вызов
диалогового окна для указания места сохранения изображения,
формата .jpg.
27
4.1.1 После того как путь и имя файла были выбраны, нажав на
кнопку «Сохранить» пользователь записывает данные
диаграммы в графический файл с тем именем, которое было
указано в диалоговом окне.
4.1.2 Если файл с именем указанным в диалоговом окне
существует, появляется сообщение с вопросом стоит ли
перезаписать существующий файл.
4.1.2.1 Если согласиться, нажав кнопку «Да», файл будет
заменен.
4.1.2.2
Если не согласится, нажав кнопку «Нет»,
диалоговое окно будет закрыто.
5. Отправка диаграммы на печать
4.2 При выборе в меню «File» пункта «Print» происходит запуск
приложения MicrosoftOneNote, отправка изображения на печать.
6. Завершение работы.
5.1При выборе в меню «File» пункта «Exit» программа закрывается,
предварительно предложив пользователю сохранить диаграмму. Все
не сохраненные данные пользователя теряются.
7. Создание нового файла
7.1. При выборе в меню «File» пункта «New» происходит вызов
диалогового окна с предложением сохранить текущую диаграмму.
7.1.1. При нажатии кнопки «Save» вызывается диалог для
сохранения текущей диаграммы. После того как диаграмма
сохранена она закрывается, появляется чистое рабочее поле.
7.1.2. При нажатии кнопки «No» текущая диаграмма закрывается,
не сохраняясь. Появляется чистое рабочее поле.
7.1.3. При нажатии кнопки «Cancel» закрывается диалог,
происходит возврат к текущей диаграмме.
28
ПРИЛОЖЕНИЕ Ж. СЦЕНАРИЙ РАБОТЫ ПРОГРАММЫ.
Типовой сценарий работы программы: создание новой диаграммы
Действия пользователя
1. Запуск программы
Действия системы
2.Появление главного окна
3. Добавление элементов диаграммы
29
4.Редактирование элементов диаграммы
30
5. Сохранение результатов работы с диаграммой
31
6. Закрытие программы
7. Закрытие главного окна
программы
Типовой сценарий работы программы: открытие диаграммы
Действия пользователя
1.Запуск программы
Действия системы
2.Появление главного окна
3.Открытие файла диаграммы
32
4. Добавление элементов диаграммы
5.Редактирование элементов диаграммы
6. Сохранение результатов работы с диаграммой
7. Закрытие программы
8. Закрытие главного окна
программы
Типовой сценарий работы программы: открытие файла диаграммы
Действия пользователя
1. Вызов меню
Действия системы
2. Выбор пункта Open в меню
3.Появление
диалогового окна
выбора файла
4.Выбор открываемого файла
33
Исключение 1:Отмена действия
5.Попытка открытия файла
Исключение 2: Невозможно прочитать файл или он не найден
6. Попытка открытия
несуществующего
файла
Исключение 1 из сценария «Открытие файла диаграмма»
Действия пользователя
Действия системы
5.Отсутствие каких либо
действий
Исключение 2 из сценария «Открытие файла диаграмма»
Действия пользователя
Действия системы
6. Вывод сообщения о
невозможности открытия файла
34
Типовой сценарий работы программы: сохранение результатов работы с
диаграммой.
Вариант 1.
Действия пользователя
1.Вызов меню
Действия системы
2.Выбор пункта Save
Исключение 1: диаграмма не была сохранена до этого
3.Попытка сохранения файла
на жесткий диск
Исключение 2: сохранение произошло неудачно
Исключение 1 из сценария работы. Вариант 1.
3.Появление диалогового окна с
выбором файла для сохранения
4.Выбор файла для сохранения
Исключение 1: действие отменено
5.Попытка сохранения файла на жесткий
диск
Исключение 2: сохранение произошло неудачно
Вариант 2.
Действия пользователя
Действия системы
1.Вызов меню
2.Выбор пункта Save as
3.Появление диалога для выбора
файла для сохранения
4.Выбор файла для сохранения
Исключение 1: отмена действия
5.Попытка сохранения файла на
жесткий диск
Исключение 2: сохранение произошло неудачно
Исключение 1 из сценария сохранения результатов работы с диаграммой, вариант 2.
35
5.Отстутствие действий
Исключение 2 из сценария сохранения результатов работы с диаграммой, вариант 2
6. Выдача сообщения об ошибке
«Невозможно сохранить файл»
Типовой сценарий работы программы: сохранение результатов работы в формате
jpeg изображения.
Вариант 3.
Действия пользователя
1.Вызов меню
Действия системы
2.Выбор пункта Export to jpeg
3.Появление диалога сохранения
изображения
4.Выбор файла для сохранения
Исключение 1: отмена действия
5.Попытка сохранения файла на
36
жесткий диск
Типовой сценарий работы программы: распечатка результатов работы.
Вариант 3.
Действия пользователя
1.Вызов меню
Действия системы
2.Выбор пункта Print
3.Запуск приложения
Microsoft OneNote
4.Выбор устройства для печати
Исключение 1: отмена действия
5.Раcпечатка диаграммы
37
ПРИЛОЖЕНИЕ З. ФРАГМЕНТ КОДА ПРОГРАММЫ.
Файл mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//Инициализация
ui->setupUi(this);
stack = new QUndoStack();
Scene = new QGraphicsScene(0, 0, 1400, 750);
Items[1] = Items[0] = NULL;
sFilename = "";
bSaved = true;
connect(Scene, SIGNAL(changed(QList<QRectF>)), this,
SLOT(SceneChanged(QList<QRectF>)));
connect(Scene, SIGNAL(selectionChanged()), this,
SLOT(SelectionChanged()));
View = new QGraphicsView;
View->setScene(Scene);
View->setDragMode(QGraphicsView::RubberBandDrag);
View->setRenderHints(QPainter::Antialiasing |
QPainter::TextAntialiasing);
View->setContextMenuPolicy(Qt::ActionsContextMenu);
setCentralWidget(View);
CreateActions(); //Создание действий
CreateMenus();
//Создание меню
CreateToolBar(); //Создание панели инструментов
}
//Деструктор класса
MainWindow::~MainWindow()
{
delete ui;
}
//Добавить абстрактный элемент
void MainWindow::AddAbstractItem(Item::NodeType Type)
{
//Инициализация
bSaved = false;
Item * selected = SelectedItem();
Item * item = new Item(Type, Item::id++, Scene, stack);
if (selected != NULL && Type != Item::Comment &&
(
(selected->GetType() == Item::Node) ||
(selected->GetType() == Item::Device && Type != Item::Node)
||
(selected->GetType() == Item::ExecutiveEnvironment && Type ==
Item::ExecutiveEnvironment)
))
{
selected->AddChild(item);
item->SetParent(selected);
}
item->setPos(50 * qrand() / 3200 + 100, 50 * qrand() / 3200 + 100);
//Установка наименования
item->SetText(Type == Item::Node ? "Node" : Type == Item::Device ?
"Device" : Type == Item::ExecutiveEnvironment ? "Executive Environment" :
"Comment");
//Добавление в стэк
stack->push(new AddCommand(item, Scene));
38
}
//Добавить узел
void MainWindow::AddNode()
{
AddAbstractItem(Item::Node);
}
//Добавить устройство
void MainWindow::AddDeviceNode()
{
AddAbstractItem(Item::Device);
}
//Добавить среду выполнения
void MainWindow::AddExEnvNode()
{
AddAbstractItem(Item::ExecutiveEnvironment);
}
//Добавить комментарий
void MainWindow::AddCommentNode()
{
AddAbstractItem(Item::Comment);
}
//Добавить абстрактную линию
void MainWindow::AddAbstractLine(Line::LineType Type)
{
//Инициалиация
bSaved = false;
ItemPair items = SelectedItemPair();
if (items == ItemPair())
return ;
Line * line = new Line(items.first, items.second, Type, Type ==
Line::Stream ? Item::id++ : 0);
stack->push(new AddCommand(line, Scene));
}
//Добавить линию связи
void MainWindow::AddLine()
{
AddAbstractLine(Line::Single);
}
//Добавить информационный поток
void MainWindow::AddStream()
{
//Инициалиация
bSaved = false;
if (Items[0] == NULL || Items[1] == NULL ||
Items[0]->GetType() == Item::Comment ||
Items[1]->GetType() == Item::Comment ||
Items[0]->GetType() == Item::StreamInfo ||
Items[1]->GetType() == Item::StreamInfo)
return ;
Line * line = new Line(Items[1], Items[0], Line::Stream, Item::id++);
stack->push(new AddCommand(line, Scene));
}
//Смена выделенного элемента
void MainWindow::SelectionChanged()
{
Items[1] = Items[0];
Items[0] = SelectedItem();
}
//Выделенный элемент
Item * MainWindow::SelectedItem() const
{
QList<QGraphicsItem *> items = Scene->selectedItems();
if (items.count() == 1)
39
return dynamic_cast<Item *>(items.first());
else
return NULL;
}
//Пара выделенных элементов
MainWindow::ItemPair MainWindow::SelectedItemPair() const
{
QList<QGraphicsItem *> items = Scene->selectedItems();
if (items.count() == 2)
{
Item * first = dynamic_cast<Item *>(items.first());
Item * second = dynamic_cast<Item *>(items.last());
if (first && second)
return ItemPair(first, second);
}
else
return ItemPair();
}
//Изменение сцены
void MainWindow::SceneChanged(QList<QRectF>)
{
QList<QGraphicsItem *> items = Scene->items();
for (int i = 0; i < items.count(); i++)
{
Line * line = dynamic_cast<Line *>(items[i]);
if (line)
{
line->MergeItems();
if (line->GetItem() != NULL)
Scene->addItem(line->GetItem());
}
}
}
//Сохранить диаграмму
void MainWindow::Save()
{
if (sFilename.isEmpty())
sFilename = QFileDialog::getSaveFileName(this, "Select file to save",
"", '*' + sFormat);
if (sFilename.isEmpty())
return ;
bSaved = true;
if (sFilename.indexOf(sFormat) == -1)
sFilename += sFormat;
QFile file(sFilename);
file.open(QIODevice::WriteOnly);
QDataStream stream(&file);
QList<QGraphicsItem *> items = Scene->items();
for (int i = 0; i < items.count(); i++)
{
Item * item = dynamic_cast<Item *>(items[i]);
if (item)
//0 - item (сохранение элементов)
stream << 0 << item->GetType() << item->GetId() << item>GetChildIds() << item->GetParentId() << item->GetText() << item->pos();
}
for (int i = 0; i < items.count(); i++)
{
Line * line = dynamic_cast<Line *>(items[i]);
if (line)
//1 - line (сохранение линий)
stream << 1 << line->GetType() << line->GetFromId() << line>GetToId() << line->GetTextId();
40
}
file.close();
}
//Открыть диаграмму
void MainWindow::Open()
{
if (!bSaved)
{
int iAnswer = QMessageBox::question(this, "Save dialog", "Save
file?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
if (iAnswer == QMessageBox::Cancel)
return;
if (iAnswer == QMessageBox::Yes)
Save();
}
Item::id = 0;
Scene->clear();
QString sFilename = QFileDialog::getOpenFileName(this, "Select file to
open", "", '*' + sFormat);
if (sFilename.indexOf(sFormat) == -1)
{
QMessageBox::critical(this, "Error", "Select correct file please",
QMessageBox::Ok);
return ;
}
if (sFilename.isEmpty())
return ;
QFile f(sFilename);
f.open(QIODevice::ReadOnly);
QDataStream stream(&f);
QList <Item *> items;
QList <Line *> lines;
while (!f.atEnd())
{
int iLine, iType, iId, iParentId;
QList<int> iChildIds;
QString sText;
QPointF p;
stream >> iLine;
if (iLine)
{
int iFromId, iToId, iTextId;
stream >> iType >> iFromId >> iToId >> iTextId;
Line * line = new Line(GetItemById(items, iFromId),
GetItemById(items, iToId),
(Line::LineType)iType,
0,
GetItemById(items, iTextId));
lines.append(line);
}
else
{
stream >> iType >> iId >> iChildIds >> iParentId >> sText >> p;
Item::id = qMax(Item::id, iId);
Item * item = new Item((Item::NodeType)iType, iId, Scene, stack);
item->SetText(sText);
item->AddChildIds(iChildIds);
item->setPos(p);
item->SetParentId(iParentId);
items.append(item);
}
}
for (int i = 0; i < items.count(); i++)
41
{
if (items[i]->GetChildIds().count())
for (int k = 0; k < items.count(); k++)
for (int c = 0; c < items[i]->GetChildCount(); c++)
if (items[i]->GetChildIdAt(c) == items[k]->GetId())
items[i]->AddChild(items[k]);
if (items[i]->GetParentId())
for (int k = 0; k < items.count(); k++)
if (items[i]->GetParentId() == items[k]->GetId())
items[i]->SetParent(items[k]);
}
for (int i = 0; i < items.count(); i++)
Scene->addItem(items[i]);
for (int i = 0; i < lines.count(); i++)
Scene->addItem(lines[i]);
Scene->clearSelection();
Item::id++;
}
//Получение элемента по идентификатору
Item * MainWindow::GetItemById(QList<Item *> lst, int id)
{
for (int i = 0; i < lst.count(); i++)
if (lst[i]->GetId() == id)
return lst[i];
}
//Создать новую диаграмму
void MainWindow::New()
{
if (!bSaved)
{
int iAnswer = QMessageBox::question(this, "Save dialog", "Save
file?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
if (iAnswer == QMessageBox::Cancel)
return;
if (iAnswer == QMessageBox::Yes)
Save();
}
Item::id = 0;
stack->clear();
Scene->clear();
}
//Выход из программы
void MainWindow::Exit()
{
this -> close();
}
//Обработка события закрытия
void MainWindow::closeEvent(QCloseEvent *event)
{
if (!bSaved)
{
int iAnswer = QMessageBox::question(this, "Save dialog", "Save
file?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
switch( iAnswer )
{
case QMessageBox::Cancel:
event->ignore();
break;
case QMessageBox::Yes:
Save();
break;
}
}}
42
Download