Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие. СОЗДАНИЕ МНОГООКОННЫХ ПРИЛОЖЕН...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
3 Мб
Скачать
☆

1.3 Объектная декомпозиция приложения

При выполнении объектной декомпозиции учтем, что каждое окно – отдельный объект. Также в виде отдельного объекта представим файл, хранящий данные на жестком диске (рисунок 3). На диаграмме объектов покажем также сообщения, которыми эти объекты в первом приближении должны обмениваться. При этом следует понимать, что процессе реализации классов возможно выявление уточняющих сообщений и дополнительных объектов.

Рисунок 3 – Объектная декомпозиция приложения Записная книжка

Аналогично тому, что класс каждого окна должен обеспечивать реакцию на все виды действий пользователя, класс объекта Файл, соответствующего файлу на диске, должен инкапсулировать все, что относится к созданию, открытию и обработке данных файла.

Следует также обратить внимание, что объект Файл от окна Форма поиска получает два сообщения: Искать первую запись и Искать следующую запись. Такая реализация упрощает организацию процесса многих записей, удовлетворяющих заданным данным.

В соответствии с внешним видом форм приложения, изображенными на рисунке 1 объекты Форма Вывод всех записей и Форма Вывод результатов поиска можно проектировать как объекты одного класса. Таким образом всего необходимо разработать 5 классов:

  • класс главной формы;

  • класс формы добавления записей;

  • класс формы вывода записей на экран;

  • класс формы поиска;

  • класс данных.

1.4 Компоновка приложения

Как и ранее при разработке оконных приложений на языке С++ при компоновке приложения целесообразно поместить описание каждого класса в свой модуль, состоящий из двух файлов:

  • файла с расширением .h, содержащего объявление класса;

  • файла с расширение .cpp, содержащего описание методов класса.

Файл основной программы соответственно назовем main.cpp.

2 Разработка классов приложения

Классы приложения разрабатываем с учетом результатов объектной декомпозиции, обязательно предусматривая методы, обрабатывающие все получаемые объектом сообщения.

2.1 Класс Главная форма

На рисунке 5 показаны вид Главной формы на экране и диаграмма класса Главная форма. Согласно своему визуальному представлению класс должен включать виджеты кнопок и обеспечивать реакцию на нажатие последних.

Рисунок 5 – Диаграмма классов класса Главной формы

Соответственно:

Window() – конструктор окна;

ShowAdd () – метод Показать форму добавления записей;

ShowPrint () – метод Показать форму вывода всех записей;

ShowFind() – метод Показать форму поиска записей.

Заголовочный файл mainForm.h должен содержать объявление класса Главной формы:

#ifndef mainForm_h

#define mainForm_h

#include <QtGui>

#define RUS(str) codec->toUnicode(str)

#include "addForm.h"

#include "findForm.h"

#include "printForm.h"

class Window : public QWidget

{

Q_OBJECT

QPushButton * btnAdd,* btnPrint,

* btnFind, * btnExit;

addForm winAdd; // форма Добавления

printForm winPrint; // форма Отображение всех

findForm winFind; // форма Поиска

public:

Window(); // конструктор

public slots:

void showAdd(); // показать форму Добавления

void showPrint(); // показать форму Отображения всех

void showFind(); // показать форму Поиска

};

#endif

Тогда файл mainForm.cpp должен содержать описание методов класса Windows:

#include "mainForm.h"

Window::Window()

{

QTextCodec *codec =

QTextCodec::codecForName("Windows-1251");

this->setWindowTitle(RUS("Записная книжка"));

// создаем кнопки

btnAdd = new QPushButton(RUS("Добавить"),this);

btnFind = new QPushButton(RUS("Найти"),this);

btnPrint = new QPushButton(RUS("Показать"),this);

btnExit = new QPushButton(RUS("Выход"),this);

// создаем компоновщик и передаем ему кнопки

QVBoxLayout *layout = new QVBoxLayout(this);

layout->addWidget(btnAdd);

layout->addWidget(btnFind);

layout->addWidget(btnPrint);

layout->addWidget(btnExit);

// устанавливаем размеры окна

resize(180,150);

// связываем сигналы от нажатия кнопок со слотами

connect(btnExit, SIGNAL(clicked(bool)),

this,SLOT(close()));

connect(btnAdd,SIGNAL(clicked(bool)),

this,SLOT(showAdd()));

connect(btnFind,SIGNAL(clicked(bool)),

this,SLOT(showFind()));

connect(btnPrint, SIGNAL(clicked(bool)),

this,SLOT(showPrint()));

}

void Window::showAdd()

{ winAdd.show(); }

void Window::showFind()

{ winFind.show(); }

void Window::showPrint()

{ winPrint.showAll(); }