Моделирование на UML и разработка автоматизированной системы "Деканат"

Практические навыки применения объектного подхода к проектированию и реализации автоматизированных информационных систем (АИС) на примере предметной области - работы деканата. Проектирование классов для АИС деканата. Описание интерфейса системы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 08.06.2016
Размер файла 954,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

"Сибирский государственный аэрокосмический университет имени академика М.Ф. Решетнева"

Институт информатики и телекоммуникаций

Кафедра информатики и вычислительной техники

КУРСОВАЯ РАБОТА

по дисциплине "Технология программирования"

на тему: "Моделирование на UML и разработка автоматизированной системы "Деканат""

Выполнил: студент группы БИ13-21

очной формы обучения

Егорова Д.В.

Руководитель: канд. техн. наук, доцент В.В. Тынченко

Железногорск 2014 г.

Содержание

  • Введение
  • 1. Варианты использования системы
  • 2. Варианты деятельности системы
  • 3 Варианты состояния системы
  • 4. Моделирование классов
  • 5. Интерфейс системы
  • Заключение
  • Список литературы
  • Приложения

Введение

Благодаря появлению интеллектуальных средств труда в виде новых информационных технологий, управление производственной и непроизводственной деятельностью человека вышло на новую ступень развития, а его функциональные возможности существенно расширились за счет вовлечения в управление современного опыта и знаний. Появилась также возможность использования информационных технологий для развития творческих способностей человека и его доступа к мировым источникам знаний. Нынешнее состояние человеческой цивилизации можно охарактеризовать как процесс информатизации общества, в котором решающая роль отводится количеству и качеству накопленной информации, ее свободой и доступностью. Циркулирующие огромные потоки информации имеют тенденцию к ещё большему увеличению. Поэтому в любой организации, как большой, так и маленькой, возникает проблема такой организации управления данными, которая обеспечила бы наиболее эффективную работу. Без баз данных невозможно представить работу большинства образовательных, финансовых, промышленных, торговых и прочих организаций. Не будь баз данных, они бы просто захлебнулись в информационной лавине. Существует много веских причин перевода существующей информации на компьютерную основу. Сейчас стоимость хранения информации в файлах электронно-вычислительных устройств дешевле, чем на бумаге. Базы данных позволяют хранить, структурировать информацию и извлекать её оптимальным для пользователя образом.

Использование компьютерных технологий позволяет сберечь значительные средства и время для получения необходимой информации, а также упрощают доступ и ведение, поскольку они основываются на комплексной обработке данных и централизации их хранения. Кроме того, ЭВМ позволяет хранить любые форматы данных. Для использования столь огромных объемов хранимой информации, помимо развития системных устройств, средств передачи данных, памяти необходимы средства обеспечения, позволяющие пользователю вводить запросы, читать файлы, модифицировать хранимые данные, добавлять новые данные или принимать решения на основании хранимых данных. Для обеспечения этих функций созданы специализированные средства - системы управления базами данных. Работа современного учебного заведения, в частности деканата, не мыслима без ведения учета студентов, подготовки различных документов и отчетов. На настоящий момент информационные системы учебных заведений отрасли представляют собой практически не масштабируемые офисные решения - технологии отдельного рабочего места или небольших рабочих групп. Одним из концептуальных проявлений этой ориентации является идеология Автоматизированных Рабочих Мест (АРМов), рассматривающая каждую конкретную задачу отдельно, а не в рамках единой среды. В деканатах существуют множество систем, каждая из которых решает только узкие задачи, причем в большинстве случаев в эти задачи сводятся к вводу и поддержании всей информации в системе в актуальном состоянии полностью вручную и просто выводу печатных форм. Отсутствует единая технология обработки и представления данных.

Разрабатываемая автоматизированная система управления (АСУ) должна решать не локальные задачи, а обеспечивать единую среду, в которой решаются задачи, стоящие перед учебными заведениями.

Цель курсовой работы:

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

Задачи курсовой работы:

произвести анализ предметной области:

выполнить моделирование вариантов использования, состояний и деятельности автоматизированной системы деканата;

осуществить проектирование классов для АИС деканата;

разработать программу на языке С++.

1. Варианты использования системы

Анализ задачи включает в себя выделение основных действующих лиц анализируемого процесса (актеров) и описание их возможных действий. Для писания этих аспектов предназначены диаграммы вариантов использования. Диаграмма вариантов использования показывает, какие актеры присутствуют в данной системе и какие функции они выполняют. В нашем случае рассмотрим одного актера: Работник деканата.

Сначала представим диаграмму вариантов использования для клиента. Клиенты выполняют следующие действия: Вывод сведений о студентах, Вычисление среднего балла студентов, Добавление дисциплин, Добавление оценок студентов, Добавление сведений о студентах, Изменение дисциплин, Изменение оценок студентов, Изменение сведений о студентах, Определение предметов, изучаемых студентами, Печать ведомостей, Сортировка, Удаление дисциплин, Удаление оценок студентов, Удаление сведений о студентах, Фильтрация, Формирование ведомостей, Формирование журнала посещений (Рисунок 1).

2. Варианты деятельности системы

Основное назначение диаграммы деятельности в том, чтобы отражать бизнес-процессы объекта. Этот тип диаграмм позволяет показать не только последовательность процессов, но и ветвление и даже синхронизацию процессов.

Последовательности возможных действий работника деканата представлены на диаграммах деятельности (Activity diagram) на рисунках 2,3 и 4.

На рисунке 2 представлена диаграмма деятельности добавления информации о студентах.

деканат объектный подход интерфейс

Для добавления сведений, работнику деканата нужно добавить информацию в следующие поля:

· Студенческий билет

· ФИО

· № группы

· Дата рождения

· Адрес

· Фотография

Если введены не все данные, то система выдаст сообщение и вернет пользователя к вводу данных. Если все поля заполнены, то система добавит информацию о студенте в базу данных.

На рисунке 3 представлена диаграмма деятельности добавления дисциплины.

Для добавления дисциплины, работнику деканата нужно добавить информацию в следующие поля:

· Номер дисциплины

· Преподаватель

· Семестр

Если введены не все данные в поля, то система выдаст сообщение и вернет пользователя к вводу данных. Если все поля заполнены, то система добавит дисциплину в базу данных.

На рисунке 4 представлена диаграмма деятельности для формирования ведомости.

Для формирования ведомости работник деканата должен выбрать группу, предмет, преподавателя, дату сдачи предмета, а также у него есть возможность отсортировать данные. После этого программа обрабатывает команды, формирует ведомость, отправляя запрос к базе данных на наличие необходимой информации, и выводит ее на печать.

Если данные, необходимые для формирования отчета отсутствуют в базе данных, то пользователю выдается сообщение о невозможности печати отчета и необходимости ввода соответствующих данных

3 Варианты состояния системы

На рисунке 5 представлена диаграмма состояния, которая описывает поведение автоматизированной системы "Деканат" во время вызова функции "Фильтрация”.

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

Рисунок 1. Диаграмма вариантов использования системы

Рисунок 2. Диаграмма деятельности добавления сведений о студенте

Рисунок 3 Диаграмма деятельности добавления дисциплины

Рисунок 4 Диаграмма деятельности формирования ведосости

Рисунок 5. Диаграмма состояния фильтрации

4. Моделирование классов

Диаграмма классов содержит описание сущностей предметной области - объектов предметной области, о которых нужно хранить сведения. Для каждого объекта указывается список атрибутов - характеристик объекта и возможных действий над сущностью. Диаграмма классов (Class diagram) содержит следующие сущности (Рисунок 5):

· Студент:

1. Номер студенческого билета

2. ФИО

3. Номер группы

4. Дата рождения

5. Адрес

6. Фото

· Успеваемость:

1. Номер дисциплины

2. Номер студенческого билета

3. Оценка

· Дисциплины:

1. Номер дисциплины

2. Название дисциплины

3. Преподаватель

4. Семестр

Следующим этапом построения логической модели является определение таблиц, которые будет содержать база данных, а также определение типов атрибутов каждой сущности. Каждая сущность модели становится таблицей, каждый атрибут - столбцом, для каждого атрибута (столбца) нужно определить тип.

Таблица 1 - Студенты

Атрибут

Тип

Номер студенческого билета

QString

ФИО

QString

Номер группы

QString

Дата рождения

QDate

Адрес

QString

Фото

QPixmap

Таблица 2 - Успеваемость

Атрибут

Тип

Номер дисциплины

unsigned int

Номер студенческого билета

QString

Оценка

unsigned char

Таблица 3 - Дисциплины

Атрибут

Тип

Номер дисциплины

unsigned int

Название дисциплины

QString

Преподаватель

QString

Семестр

unsigned char

Полученные таблицы станут основой для проектируемой базы данных.

Рисунок 6. Диаграмма классов

5. Интерфейс системы

Рисунок 7. Окно просмотра и редактирования таблицы "Дисциплины"

Рисунок 8. Окно просмотра и редактирования таблицы "Студенты"

Рисунок 8. Окно просмотра и редактирования таблицы "Успеваемость"

На рисунке 6-8 представлены варианты использования программы, позволяющие вводить:

· Данные о студенте;

· Дисциплины, изучаемые студентами;

· Успеваемость студентов;

На рисунке 9 представлены варианты использования системы, позволяющие:

· Вывести сведения о всех студентах, изучающих выбранную дисциплину;

· Определить, какие дисциплины изучает выбранный студент;

· Вычислить средний балл выбранного студента;

Требования к составу и параметрами технических средств

Система должна работать на IBM совместимых персональных компьютерах и под управлением семейства операционных систем Win 32 (Windows 95, Windows 98, Windows 2000, Windows NT и т.п.).

Минимальная конфигурация:

· Тип процессора Pentium и выше

· Объем оперативного запоминающего

устройства………………………………………32 Мб и более

Рисунок 9.Окна запросов

Заключение

В процессе выполнения курсовой работы было разработано программное средство, позволяющее автоматизировать систему учета и движения контингента студентов. Данная работа реализована в виде одного приложения, которое предназначено для работы сотрудника деканата. Результатами работы приложения являются таблицы и ведомости, содержащие результаты учета и движения контингента студентов. Ведомости выдаются в формате Word. При программировании программного продукта была использована платформа разработки приложений "Qt Creator”.

В процессе работы были определены основные функции нашей системы, описан процесс ее работы и выполнено моделирование данных, после чего реализована средствами языка программирования С++ автоматизированная система "Деканат".

Также нами были описаны диаграммы, которые создаются с использованием Case-средства Rational Rose. С использованием этого средства быстрой разработки были построены диаграмма вариантов использования, модель деятельности, диаграмма состояний, а также диаграмма классов.

Диаграмма вариантов использования отражает все возможные действия пользователя системы при работе с системой "Деканат". Для более подробного ее описания были представлены модели деятельности, диаграмма состояний, которые отражают взаимодействие пользователя системы.

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

Список литературы

1. Кузин А.В. Базы данных: учеб. пособ. для студ. высш. учеб. заведений / А.В. Кузин С.В. Левонисова. - 2-е изд. - М.: Издательский центр "Академия" 2008. - 320 с

2. Минеев П.В. Проектирование информационных систем: Методические указания к выполнению курсовой работы для студентов специальности "Прикладная информатика в экономике" [Текст] / П.В. Минеев. - М.: КГТУ, Красноярск, 2004. - 36 с.

3. Учебный курс - Проектирование информационных систем [Электронный ресурс]. - Режим доступа: http://www.INTUIT.ru.

4. Ткаченко В.А. Системы управления базами данных и экспертные системы [Электронный ресурс] / В.А. Ткаченко. - Режим доступа: lessons-tva/edu/e-inf2/m2t4.html свободный. - Название с экрана.

5. Пикулин В.В. Разработка и использование учебных планов в системе открытого образования / Пикулин В.В., Арбузов В.А., Мошечков В.В., Ханислямова С.В. // В сб.: Современная образовательная среда / Тезисы докладов Всероссийской конференции (21 - 24 ноября 2001 года, г. Москва) /. - М.: ВВЦ, 201. - с.128 - 129.

6. Бугорский В.Н., Соколов Р.В. Сетевая экономика и проектирование информационных систем [Текст] / В.Н. Бугорский, Р.В. Соколов. - М.: Питер 2007. - 320 с.: ил.

7. E. Мамаев "MS SQL 2000 в подлиннике" М.: издательско-торговый дом "Русская редакция", 2001 г. 1286 с.: ил

Приложения

Приложение 1

Описание Классов

structdef. h

// Запрещает дублированное подключение. h файла

#pragma once

#include <string. h>

#include <QtCore/QDate>

#include <QtGui/QPixmap>

#include <QtCore/QString>

// Описание структур для ОСНОВНОЙ работы с данными в памяти приложения

class Discipline

{

public:

Discipline ()

{

m_disciplineNum = 0;

m_term = 0;

}

inline unsigned int disciplineNum () const { return m_disciplineNum; }

inline void setDisciplineNum (const unsigned int &disciplineNum) { m_disciplineNum = disciplineNum; }

inline QString caption () const { return m_caption; }

inline void setCaption (const QString &caption) { m_caption = caption; }

inline QString teacher () const { return m_teacher; }

inline void setTeacher (const QString &teacher) { m_teacher = teacher; }

inline unsigned char term () const { return m_term; }

inline void setTerm (const unsigned char &term) { m_term = term; }

friend QDataStream &operator<< (QDataStream &stream, const Discipline &discipline);

friend QDataStream &operator>> (QDataStream &stream, Discipline &discipline);

private:

unsigned int m_disciplineNum; // Номер дисциплины

QString m_caption; // Название дисциплины

QString m_teacher; // Преподаватель

unsigned char m_term; // Семестр

};

class Student

{

public:

Student () {}

inline QString certificateNum () const { return m_certificateNum; }

inline void setCertificateNum (const QString &certificateNum) { m_certificateNum = certificateNum; }

inline QString name () const { return m_name; }

inline void setName (const QString &name) { m_name = name; }

inline QString groupNum () const { return m_groupNum; }

inline void setGroupNum (const QString &groupNum) { m_groupNum = groupNum; }

inline QDate birthdayDate () const { return m_birthdayDate; }

inline void setBirthdayDate (const QDate &birthdayDate) { m_birthdayDate = birthdayDate; }

inline QString address () const { return m_address; }

inline void setAddress (const QString &address) { m_address = address; }

inline QPixmap photo () const { return m_photo; }

inline void setPhoto (const QPixmap &photo) { m_photo = photo; }

friend QDataStream &operator<< (QDataStream &stream, const Student &student);

friend QDataStream &operator>> (QDataStream &stream, Student &student);

private:

QString m_certificateNum; // Номер студенческого билета

QString m_name; // ФИО

QString m_groupNum; // Номер группы

QDate m_birthdayDate; // Дата рождения

QString m_address; // Адрес

QPixmap m_photo; // Фото - массив байт

};

class DisciplineStudent

{

public:

DisciplineStudent ()

{

m_disciplineNum = 0;

m_mark = 0;

}

inline unsigned int disciplineNum () const { return m_disciplineNum; }

inline void setDisciplineNum (const unsigned int &disciplineNum) { m_disciplineNum = disciplineNum; }

inline QString certificateNum () const { return m_certificateNum; }

inline void setCertificateNum (const QString &certificateNum) { m_certificateNum = certificateNum; }

inline unsigned char mark () const { return m_mark; }

inline void setMark (const unsigned char &mark) { m_mark = mark; }

friend QDataStream &operator<< (QDataStream &stream, const DisciplineStudent &disciplineStudent);

friend QDataStream &operator>> (QDataStream &stream, DisciplineStudent &disciplineStudent);

private:

unsigned int m_disciplineNum; // Номер дисциплины

QString m_certificateNum; // Номер студенческого билета

unsigned char m_mark; // Оценка

};

struct TFilter

{

TFilter ()

{

enabled = false;

equal = true;

}

bool enabled;

bool equal;

};

struct TStringFilter: public TFilter

{

TStringFilter ()

{

wordWholeEnabled = false;

}

bool wordWholeEnabled;

};

struct TDateFilter: public TFilter

{

QDate startDate;

QDate endDate;

};

Пример реализации диалога таблицы "Студенты":

studentdialog. cpp

#include "studentdialog. h"

#include "ui_studentdialog. h"

#include <QtWidgets/QFileDialog>

#include <QtWidgets/QMessageBox>

#include "structdef. h"

#include "mainwindow. h"

StudentDialog:: StudentDialog (QWidget *parent):

QDialog (parent),

ui (new Ui:: StudentDialog),

m_action (AddAction)

{

ui->setupUi (this);

init ();

setWindowTitle ("Добавление строки");

}

StudentDialog:: StudentDialog (const QString &certificateNum, QWidget *parent):

QDialog (parent),

ui (new Ui:: StudentDialog),

m_action (EditAction),

m_certificateNum (certificateNum)

{

ui->setupUi (this);

init ();

setWindowTitle ("Изменение строки");

}

StudentDialog:: ~StudentDialog ()

{

delete ui;

}

void StudentDialog:: on_tbPhoto_clicked ()

{

QString fileName = QFileDialog:: getOpenFileName (this, tr ("Выберите фотографию"),

QString (),

tr ("Изображения (*. bmp *. gif *. jpg *. jpeg *. png *. pbm *. pgm *. ppm *. xbm *. xpm)"));

if (fileName. isEmpty ())

return;

ui->lPhoto->setPixmap (QPixmap (fileName));

}

void StudentDialog:: on_pbRemovePhoto_clicked ()

{

ui->lPhoto->setPixmap (QPixmap ());

}

void StudentDialog:: on_pbOk_clicked ()

{

if (ui->leName->text (). isEmpty ()

|| ui->leAddress->text (). isEmpty ()

|| ui->leCertificateNum->text (). isEmpty ()

|| ui->leGroupNum->text (). isEmpty ()) {

QMessageBox:: information (this, tr ("Внимание"), tr ("Необходимо заполнить все доступные поля на форме"));

return;

}

if (m_action == AddAction) {

// Поиск в таблице студентов строки с номером студенческого билета

for (int i = 0; i < mainWindow->studentList () - >count (); i++) {

Student *student = mainWindow->studentList () - >at (i);

if (QString:: compare (student->certificateNum (), ui->leCertificateNum->text (), Qt:: CaseInsensitive)! = 0)

continue;

QMessageBox:: information (this, tr ("Внимание"), tr ("Необходимо ввести другой номер студенческого билета"));

return;

}

// Выделение памяти для новой строки

Student *student = new Student ();

// Заполнение значений новой строки значениями из элементов графического окна

student->setName (ui->leName->text ());

student->setBirthdayDate (ui->deBirthdayDate->date ());

student->setAddress (ui->leAddress->text ());

student->setCertificateNum (ui->leCertificateNum->text ());

student->setGroupNum (ui->leGroupNum->text ());

if (ui->lPhoto->pixmap ()! = NULL)

student->setPhoto (ui->lPhoto->pixmap () - >copy ());

// Добавление новой строки в общий список строк таблицы

mainWindow->studentList () - >append (student);

} else {

// Поиск в таблице студентов строки с номером студенческого билета

for (int i = 0; i < mainWindow->studentList () - >count (); i++) {

Student *student = mainWindow->studentList () - >at (i);

if (QString:: compare (student->certificateNum (), m_certificateNum, Qt:: CaseInsensitive)! = 0)

continue;

student->setName (ui->leName->text ());

student->setAddress (ui->leAddress->text ());

student->setCertificateNum (ui->leCertificateNum->text ());

student->setBirthdayDate (ui->deBirthdayDate->date ());

student->setGroupNum (ui->leGroupNum->text ());

if (ui->lPhoto->pixmap ()! = NULL)

student->setPhoto (ui->lPhoto->pixmap () - >copy ());

// Каскадное изменение данных в таблице "Успеваемость"

foreach (DisciplineStudent *disciplineStudent, *mainWindow->disciplineStudentList ()) {

if (QString:: compare (disciplineStudent->certificateNum (), m_certificateNum, Qt:: CaseInsensitive)! = 0)

continue;

disciplineStudent->setCertificateNum (ui->leCertificateNum->text ());

}

break;

}

}

accept ();

}

void StudentDialog:: on_pbCancel_clicked ()

{

reject ();

}

void StudentDialog:: init ()

{

// Инициализация графических объектов исходными значениями

ui->leName->setText (QString ());

ui->leAddress->setText (QString ());

ui->leCertificateNum->setText (QString ());

ui->deBirthdayDate->setDate (QDate (2000, 1, 1));

ui->leGroupNum->setText (QString ());

if (m_action == EditAction) {

// Поиск в таблице "Студенты" строки с номером студенческого билета

for (int i = 0; i < mainWindow->studentList () - >count (); i++) {

Student *student = mainWindow->studentList () - >at (i);

if (QString:: compare (student->certificateNum (), m_certificateNum, Qt:: CaseInsensitive)! = 0)

continue;

// Инициализация графических объектов исходными значениями

ui->leName->setText (student->name ());

ui->leAddress->setText (student->address ());

ui->leCertificateNum->setText (student->certificateNum ());

ui->deBirthdayDate->setDate (student->birthdayDate ());

ui->leGroupNum->setText (student->groupNum ());

ui->lPhoto->setPixmap (student->photo ());

break;

}

}

}

Пример реализации фильтрации таблицы "Студенты":

studenttablefiltermodel. cpp

#include "studenttablefiltermodel. h"

StudentTableFilterModel:: StudentTableFilterModel (QObject *parent):

QSortFilterProxyModel (parent)

{

}

StudentFilter *StudentTableFilterModel:: studentFilter ()

{

return &m_studentFilter;

}

bool StudentTableFilterModel:: filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const

{

bool isAcceptsRow = false;

// Фильтр 1 "Номер студенческого"

if (m_studentFilter. filterCondition1 (). enabled) {

QModelIndex index = sourceModel () - >index (sourceRow, 0, sourceParent);

bool isEqual = false;

// Поиск выражения целиком

if (m_studentFilter. filterCondition1 (). wordWholeEnabled)

isEqual = (QString:: compare (index. data (Qt:: UserRole). toString (), m_studentFilter. certificateNum ()) == 0);

else if (! m_studentFilter. certificateNum (). isEmpty ())

isEqual = index. data (Qt:: UserRole). toString (). contains (m_studentFilter. certificateNum (), Qt:: CaseInsensitive);

if ( (m_studentFilter. filterCondition1 (). equal == false && isEqual! = true)

|| (m_studentFilter. filterCondition1 (). equal == true && isEqual == true)) {

isAcceptsRow = true;

} else if (! m_studentFilter. anyConditionEnabled ()) {

return false;

}

}

// Фильтр 2 "ФИО"

if (m_studentFilter. filterCondition2 (). enabled) {

QModelIndex index = sourceModel () - >index (sourceRow, 1, sourceParent);

bool isEqual = false;

// Поиск выражения целиком

if (m_studentFilter. filterCondition2 (). wordWholeEnabled)

isEqual = (QString:: compare (index. data (Qt:: UserRole). toString (), m_studentFilter. name ()) == 0);

else if (! m_studentFilter. name (). isEmpty ())

isEqual = index. data (Qt:: UserRole). toString (). contains (m_studentFilter. name (), Qt:: CaseInsensitive);

if ( (m_studentFilter. filterCondition2 (). equal == false && isEqual! = true)

|| (m_studentFilter. filterCondition2 (). equal == true && isEqual == true)) {

isAcceptsRow = true;

} else if (! m_studentFilter. anyConditionEnabled ()) {

return false;

}

}

// Фильтр 3 "Номер группы"

if (m_studentFilter. filterCondition3 (). enabled) {

QModelIndex index = sourceModel () - >index (sourceRow, 2, sourceParent);

bool isEqual = false;

// Поиск выражения целиком

if (m_studentFilter. filterCondition3 (). wordWholeEnabled)

isEqual = (QString:: compare (index. data (Qt:: UserRole). toString (), m_studentFilter. groupNum ()) == 0);

else if (! m_studentFilter. groupNum (). isEmpty ())

isEqual = index. data (Qt:: UserRole). toString (). contains (m_studentFilter. groupNum (), Qt:: CaseInsensitive);

if ( (m_studentFilter. filterCondition3 (). equal == false && isEqual! = true)

|| (m_studentFilter. filterCondition3 (). equal == true && isEqual == true)) {

isAcceptsRow = true;

} else if (! m_studentFilter. anyConditionEnabled ()) {

return false;

}

}

// Фильтр 4 "Дата рождения"

if (m_studentFilter. filterCondition4 (). enabled) {

QModelIndex index = sourceModel () - >index (sourceRow, 3, sourceParent);

// Поиск в указанный период времени

bool isEqual = (index. data (Qt:: UserRole). toDate () >= m_studentFilter. filterCondition4 (). startDate

&& index. data (Qt:: UserRole). toDate () <= m_studentFilter. filterCondition4 (). endDate);

if ( (m_studentFilter. filterCondition4 (). equal == false && isEqual! = true)

|| (m_studentFilter. filterCondition4 (). equal == true && isEqual == true)) {

isAcceptsRow = true;

} else if (! m_studentFilter. anyConditionEnabled ()) {

return false;

}

}

// Фильтр 5 "Адрес"

if (m_studentFilter. filterCondition5 (). enabled) {

QModelIndex index = sourceModel () - >index (sourceRow, 4, sourceParent);

bool isEqual = false;

// Поиск выражения целиком

if (m_studentFilter. filterCondition5 (). wordWholeEnabled)

isEqual = (QString:: compare (index. data (Qt:: UserRole). toString (), m_studentFilter. address ()) == 0);

else if (! m_studentFilter. address (). isEmpty ())

isEqual = index. data (Qt:: UserRole). toString (). contains (m_studentFilter. address (), Qt:: CaseInsensitive);

if ( (m_studentFilter. filterCondition5 (). equal == false && isEqual! = true)

|| (m_studentFilter. filterCondition5 (). equal == true && isEqual == true)) {

isAcceptsRow = true;

} else if (! m_studentFilter. anyConditionEnabled ()) {

return false;

}

}

return isAcceptsRow;

}

Пример реализации таблицы "Студенты"

studenttablewidget. cpp

#include "studenttablewidget. h"

#include "ui_studenttablewidget. h"

#include <QtWidgets/QMessageBox>

#include <QtGui/QStandardItemModel>

#include "mainwindow. h"

#include "studentdialog. h"

#include "studenttablefiltermodel. h"

StudentTableWidget:: StudentTableWidget (QWidget *parent):

QWidget (parent),

ui (new Ui:: StudentTableWidget)

{

ui->setupUi (this);

init ();

refresh ();

}

StudentTableWidget:: ~StudentTableWidget ()

{

delete ui;

}

void StudentTableWidget:: on_pbAdd_clicked ()

{

StudentDialog studentDialog (this);

studentDialog. exec ();

refresh ();

}

void StudentTableWidget:: on_pbEdit_clicked ()

{

QModelIndexList indexes = ui->tbvStudent->selectionModel () - >selectedRows ();

if (indexes. count ()! = 1)

return;

StudentDialog studentDialog (indexes. at (0). data (Qt:: DisplayRole). toString (), this);

studentDialog. exec ();

refresh ();

emit dataChanged ();

}

void StudentTableWidget:: on_pbRemove_clicked ()

{

QModelIndexList indexes = ui->tbvStudent->selectionModel () - >selectedRows ();

if (indexes. count () == 0)

return;

QMessageBox:: StandardButton button = QMessageBox:: question (this, "Внимание",

"Вы действительно хотите удалить выбранные строки?",

QMessageBox:: Ok | QMessageBox:: Cancel);

if (button == QMessageBox:: Cancel)

return;

foreach (QModelIndex index, indexes) {

for (int i = 0; i < mainWindow->studentList () - >count (); i++) {

Student *student = mainWindow->studentList () - >at (i);

if (QString:: compare (student->certificateNum (), index. data (Qt:: DisplayRole). toString (), Qt:: CaseInsensitive)! = 0)

continue;

mainWindow->studentList () - >removeAt (i);

i--;

}

}

refresh ();

}

void StudentTableWidget:: init ()

{

m_modelStudent = new QStandardItemModel (0, 5, ui->tbvStudent);

m_modelStudent->setHeaderData (0, Qt:: Horizontal, "Студенческий");

m_modelStudent->setHeaderData (1, Qt:: Horizontal, "ФИО");

m_modelStudent->setHeaderData (2, Qt:: Horizontal, "Номер группы");

m_modelStudent->setHeaderData (3, Qt:: Horizontal, "Дата рождения");

m_modelStudent->setHeaderData (4, Qt:: Horizontal, "Адрес");

ui->tbvStudent->setModel (m_modelStudent);

connect (ui->tbvStudent->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)),

this, SLOT (tbvStudent_selectionModel_selectionChanged (const QItemSelection &, const QItemSelection &)));

// Установка чередования цвета для строк

ui->tbvStudent->setAlternatingRowColors (true);

QPalette alternatingRowPalette = ui->tbvStudent->palette ();

alternatingRowPalette. setColor (QPalette:: AlternateBase, QColor (230,248,255));

ui->tbvStudent->setPalette (alternatingRowPalette);

// Установка размеров столбцов таблицы

ui->tbvStudent->setColumnWidth (0, 80);

ui->tbvStudent->setColumnWidth (1, 140);

ui->tbvStudent->setColumnWidth (2, 80);

ui->tbvStudent->setColumnWidth (3, 100);

ui->tbvStudent->setColumnWidth (4, 160);

m_studentTableFilterModel = new StudentTableFilterModel (ui->tbvFilterStudent);

m_studentTableFilterModel->setSourceModel (m_modelStudent);

ui->tbvFilterStudent->setModel (m_studentTableFilterModel);

connect (ui->tbvFilterStudent->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)),

this, SLOT (tbvFilterStudent_selectionModel_selectionChanged (const QItemSelection &, const QItemSelection &)));

// Установка чередования цвета для строк

ui->tbvFilterStudent->setAlternatingRowColors (true);

alternatingRowPalette = ui->tbvFilterStudent->palette ();

alternatingRowPalette. setColor (QPalette:: AlternateBase, QColor (230,248,255));

ui->tbvFilterStudent->setPalette (alternatingRowPalette);

// Установка размеров столбцов таблицы

ui->tbvFilterStudent->setColumnWidth (0, 80);

ui->tbvFilterStudent->setColumnWidth (1, 140);

ui->tbvFilterStudent->setColumnWidth (2, 80);

ui->tbvFilterStudent->setColumnWidth (3, 100);

ui->tbvFilterStudent->setColumnWidth (4, 160);

}

void StudentTableWidget:: refresh ()

{

m_modelStudent->removeRows (0, m_modelStudent->rowCount ());

foreach (Student *student, *mainWindow->studentList ()) {

// Добавление новой строки в модель

addRow (student);

}

}

void StudentTableWidget:: addRow (const Student *student)

{

QList<QStandardItem*> rowItems;

QStandardItem *item;

// Номер студенческого

item = new QStandardItem ();

item->setData (student->certificateNum (), Qt:: UserRole);

item->setData (student->certificateNum (), Qt:: DisplayRole);

item->setData (student->certificateNum (), Qt:: ToolTipRole);

rowItems. append (item);

// Столбец ФИО

item = new QStandardItem ();

item->setData (student->name (), Qt:: UserRole);

item->setData (student->name (), Qt:: DisplayRole);

item->setData (student->name (), Qt:: ToolTipRole);

rowItems. append (item);

// Номер группы

item = new QStandardItem ();

item->setData (student->groupNum (), Qt:: UserRole);

item->setData (student->groupNum (), Qt:: DisplayRole);

item->setData (student->groupNum (), Qt:: ToolTipRole);

rowItems. append (item);

// День рождения

item = new QStandardItem ();

item->setData (student->birthdayDate (), Qt:: UserRole);

item->setData (student->birthdayDate (). toString (), Qt:: DisplayRole);

item->setData (student->birthdayDate (), Qt:: ToolTipRole);

rowItems. append (item);

// Адрес

item = new QStandardItem ();

item->setData (student->address (), Qt:: UserRole);

item->setData (student->address (), Qt:: DisplayRole);

item->setData (student->address (), Qt:: ToolTipRole);

rowItems. append (item);

m_modelStudent->appendRow (rowItems);

}

void StudentTableWidget:: tbvStudent_selectionModel_selectionChanged (const QItemSelection &deselected, const QItemSelection &selected)

{

Q_UNUSED (deselected);

Q_UNUSED (selected);

QModelIndexList indexes = ui->tbvStudent->selectionModel () - >selectedRows ();

ui->pbRemove->setEnabled ( (indexes. count () == 0)? false: true);

if (indexes. count ()! = 1) {

ui->lPhoto->setText ("Нет фотографии");

ui->pbEdit->setEnabled (false);

return;

}

ui->pbEdit->setEnabled (true);

// Получение номера студенческого билета

foreach (Student *student, *mainWindow->studentList ()) {

if (QString:: compare (student->certificateNum (), indexes. at (0). data (Qt:: UserRole). toString ())! = 0)

continue;

// Извлечение фотографии для выделенной строки

if (student->photo (). isNull ())

ui->lPhoto->setText ("Нет фотографии");

else

ui->lPhoto->setPixmap (student->photo ());

break;

}

}

void StudentTableWidget:: tbvFilterStudent_selectionModel_selectionChanged (const QItemSelection &deselected, const QItemSelection &selected)

{

Q_UNUSED (deselected);

Q_UNUSED (selected);

QModelIndexList indexes = ui->tbvFilterStudent->selectionModel () - >selectedRows ();

if (indexes. count ()! = 1) {

ui->lFilterPhoto->setText ("Нет фотографии");

return;

}

// Получение номера студенческого билета

foreach (Student *student, *mainWindow->studentList ()) {

if (QString:: compare (student->certificateNum (), indexes. at (0). data (Qt:: UserRole). toString ())! = 0)

continue;

// Извлечение фотографии для выделенной строки

if (student->photo (). isNull ())

ui->lFilterPhoto->setText ("Нет фотографии");

else

ui->lFilterPhoto->setPixmap (student->photo ());

break;

}

}

void StudentTableWidget:: on_chbCertificateNum_clicked (bool checked)

{

ui->cbFilterCondition1->setEnabled (checked);

ui->leFilterValue1->setEnabled (checked);

ui->chbWordWhole1->setEnabled (checked);

}

void StudentTableWidget:: on_chbName_clicked (bool checked)

{

ui->cbFilterCondition2->setEnabled (checked);

ui->leFilterValue2->setEnabled (checked);

ui->chbWordWhole2->setEnabled (checked);

}

void StudentTableWidget:: on_chbGroupNum_clicked (bool checked)

{

ui->cbFilterCondition3->setEnabled (checked);

ui->leFilterValue3->setEnabled (checked);

ui->chbWordWhole3->setEnabled (checked);

}

void StudentTableWidget:: on_chbBirthdayDate_clicked (bool checked)

{

ui->cbFilterCondition4->setEnabled (checked);

ui->deFilterValueStart4->setEnabled (checked);

ui->deFilterValueEnd4->setEnabled (checked);

}

void StudentTableWidget:: on_chbAddress_clicked (bool checked)

{

ui->cbFilterCondition5->setEnabled (checked);

ui->leFilterValue5->setEnabled (checked);

ui->chbWordWhole5->setEnabled (checked);

}

void StudentTableWidget:: on_pbApply_clicked ()

{

ui->tbvFilterStudent->selectionModel () - >clearSelection ();

m_studentTableFilterModel->studentFilter () - >setCertificateNum (ui->leFilterValue1->text ());

m_studentTableFilterModel->studentFilter () - >setName (ui->leFilterValue2->text ());

m_studentTableFilterModel->studentFilter () - >setGroupNum (ui->leFilterValue3->text ());

m_studentTableFilterModel->studentFilter () - >setAddress (ui->leFilterValue5->text ());

m_studentTableFilterModel->studentFilter () - >setAnyConditionEnabled (ui->chbAnyCondition->isChecked ());

TStringFilter filterCondition1;

filterCondition1. enabled = ui->chbCertificateNum->isChecked ();

filterCondition1. equal = (ui->cbFilterCondition1->currentIndex () == 0)? true: false;

filterCondition1. wordWholeEnabled = ui->chbWordWhole1->isChecked ();

m_studentTableFilterModel->studentFilter () - >setFilterCondition1 (filterCondition1);

TStringFilter filterCondition2;

filterCondition2. enabled = ui->chbName->isChecked ();

filterCondition2. equal = (ui->cbFilterCondition2->currentIndex () == 0)? true: false;

filterCondition2. wordWholeEnabled = ui->chbWordWhole2->isChecked ();

m_studentTableFilterModel->studentFilter () - >setFilterCondition2 (filterCondition2);

TStringFilter filterCondition3;

filterCondition3. enabled = ui->chbGroupNum->isChecked ();

filterCondition3. equal = (ui->cbFilterCondition3->currentIndex () == 0)? true: false;

filterCondition3. wordWholeEnabled = ui->chbWordWhole3->isChecked ();

m_studentTableFilterModel->studentFilter () - >setFilterCondition3 (filterCondition3);

TDateFilter filterCondition4;

filterCondition4. enabled = ui->chbBirthdayDate->isChecked ();

filterCondition4. equal = (ui->cbFilterCondition4->currentIndex () == 0)? true: false;

filterCondition4. startDate = ui->deFilterValueStart4->date ();

filterCondition4. endDate = ui->deFilterValueEnd4->date ();

m_studentTableFilterModel->studentFilter () - >setFilterCondition4 (filterCondition4);

TStringFilter filterCondition5;

filterCondition5. enabled = ui->chbAddress->isChecked ();

filterCondition5. equal = (ui->cbFilterCondition5->currentIndex () == 0)? true: false;

filterCondition5. wordWholeEnabled = ui->chbWordWhole5->isChecked ();

m_studentTableFilterModel->studentFilter () - >setFilterCondition5 (filterCondition5);

// Применение фильтра к модели

m_studentTableFilterModel->invalidate ();

}

Аналогично данному примеру реализованы таблицы "Успеваемость" и "Дисциплины"

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.