Автоматизация учета пациентов больницы

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,34 Мб
  • Опубликовано:
    2014-05-04
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Автоматизация учета пациентов больницы

Введение


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

В Минске на данный момент функционируют 12 городских больниц, а численность населения в городе к 2011 году составила 1.8 миллионов человек, следовательно одна больница в среднем обслуживает порядка 100 000 человек. На данный момент учет пациентов в больнице ведется путем регистрации карт пациентов и ведения историй болезней по каждому отдельному случаю поступления пациента. В истории болезней вписываются все наблюдения, процедуры, анализы и т.п. пациента во время его прибывания (если он лечится стационарно) или посещения (если он лечится амбулаторно) в больнице.

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

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

Раздел «Постановка задачи» включает все необходимые требования, предъявляяемые к программному средству и используемых в ней структурам данных.

Раздел «Логическая модель данных структуры БД» представляет собой набор сущностей, образующихся в процессе разработки.

Раздел «Физическая модель» формирует реализационные подробности каждой из сущностей БД.

Раздел «Описание программы» характеризует внутреннюю структуру данных программы и используемые стандартные типы.

Раздел «Тестирование» предусматривает описание возможностей программы с иллюстрированными примерами.

Раздел «Применение» описывает все возможные ситуации работы программы.

В заключении подводятся итоги и результаты достижения целей курсовой работы.

Приложения содержат дополнительную информацию о структуре программы и необходимые диаграммы.

 


1. Постановка задачи

1.1    Требования к программному продукту

Требования к базе данных

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

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

Требования к интерфейсу программы

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

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

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

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

1.2    Входная информация


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

Каждая запись в таблице пациентов имеет:

-       ФИО, дату рождения, пол;

-             город, место проживания;

-             контактные данные (телефон, адрес электронной почты);

-             дату добавления в БД, поле для заметок.

Каждая запись в таблице врачей имеет:

-       ФИО;

-             отделение, должность, кабинет;

-             логин и пароль (не обязательные поля);

-             контактные данные.

Каждая запись в таблице отделений содержит:

-       название отделения;

-             телефон и адрес электронной почты.

Каждая запись в таблице палат содержит:

-       номер палаты;

-             количество мест в палате.

1.3    Выходная информация


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

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

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

1.4    Постоянная информация


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

2.     
Логическая модель данных


Логическая модель данных данного программного продукта состоит из следующих сущностей:

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

-             Карта. Эта сущность определяет информацию о всех поступлениях в больницу конкретного пациента. Пациент может поступать в больницу с заболеваниями множество раз, поэтому сущность «карта» образует с сущностью «пациент» связь «один-ко-многим»;

-             Наблюдение. Сущность описывает информацию о конкретной карте. Т.к. к одной карте (факт поступления) привязано множество наблюдений, то сущность «карта» образует связь «один-ко-многим» с сущностью «наблюдение»;

-             Врач. Сущность включает в себя информацию о врачах. Т.к. карту на пациента выписывает конкретный врач и один и тот же врач может зарегистрировать множество карт для различных пациентов, то сущность «карта» образует с врачем связь «один-ко-многим».

-             Отделение. Сущность содержит всю информацию об отделениях больницы. Все врачи относятся к какому-либо отделению, поэтому сущность «отделение» образует с сущностью «врач» связь «один-ко многим».

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

-             Выписанные пациенты. Сущность определяет информацию о картах пациентов, которых выписали. Образует с сущностью карта связь «один-к-одному».

3.     
Физическая модель данных

интерфейс база программный

Отношения, разработанные на стадии формирования логической модели данных, преобразуются в следующие таблицы: PACIENT, KARTA, NABLUDENIE, VRACH, OTDELENIE, PALATA, VYPISANNYE_PACIENTY. Более подробно общая схема базы данных представлена в приложении А.

Уникальные индексы были определены для следующих полей таблиц: PACIENT(ID_PACIENTA), KARTA(ID_KARTY), NABLUDENIE(ID_NABLUDENIYA), VRACH(ID_VRACHA), OTDELENIE(ID_OTDELENIYA), PALATA(ID_PALATY), VYPISANNYE_PACIENTY(ID_VYP_PAC).

В базе данных был необходим контроль за введенными данными. Основная их часть выполняются программно, т.е. при при помощи ограничения ввода данных, например для определенных столбцев есть возможность лишь выбрать вариант из приведенных. Однако также были произведены действия по контролю данных и за счет средств СУБД. Ограничения, имеющиеся в логической модели данных, реализованы при помощи триггеров для следующих полей таблиц: VRACH (проверяется поле LOGIN, при добавлении новой записи), PALATA (проверяет поле NO_PALATY).

Для создания сущностей, управления данными и удаления данных в БД необходимо выполнение SQL-выражений. Основные SQL-выражения для создания сущностей описаны в таблице 3.1.

Таблица 3.1 - SQL-выражения для создания таблиц

Выражение

Описание

CREATE TABLE "pacient" ( "id_pacienta" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "familiya" TEXT NOT NULL, "imya" TEXT NOT NULL, "otchestvo" TEXT NOT NULL, "pol" TEXT NOT NULL, "data_rojd" TEXT NOT NULL, "gorod" TEXT NOT NULL, "adres" TEXT NOT NULL, "telefon" TEXT, "email" TEXT, "data_dobavleniya" TEXT NOT NULL, "zametki" TEXT )

Создание таблицы пациентов, не имеет внешних ключей. Содержит информацию о пациентах.

CREATE TABLE "karta" ( "id_karty" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "data_sozd" TEXT(10) NOT NULL, "id_vracha" INTEGER NOT NULL, "id_pacienta" INTEGER NOT NULL, "id_palaty" INTEGER, "status" TEXT(12) NOT NULL, CONSTRAINT "fkey0" FOREIGN KEY ("id_vracha") REFERENCES "vrach" ("id_vracha")  ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "fkey1" FOREIGN KEY ("id_pacienta") REFERENCES "pacient" ("id_pacienta")  ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT "fkey2" FOREIGN KEY ("id_palaty") REFERENCES "palata" ("id_palaty")  ON DELETE CASCADE ON UPDATE CASCADE )

Создание таблицы карт пациентов. Ссылается на таблицы палат, врачей и пациентов.

CREATE TABLE "nabludenie" ( "id_nabludeniya" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "id_karty" INTEGER NOT NULL, "data" TEXT NOT NULL, "vremya" TEXT NOT NULL, "lekarstvo" TEXT, "dozirovka" TEXT, "procedura" TEXT, "analiz" TEXT, "rezultat" TEXT, "otchet" TEXT, CONSTRAINT "fkey1" FOREIGN KEY ("id_karty") REFERENCES "karta" ("id_karty") ON DELETE CASCADE ON UPDATE CASCADE)

Сздание таблицы наблюдений. Имеет один внешний ключ, относящийся к таблице карт.

CREATE TABLE "otdelenie" ( "id_otdeleniya" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" TEXT NOT NULL, "telefon" TEXT, "email" TEXT )

Создание таблицы отделений. Таблица не имеет внешних ключей.

CREATE TABLE "vrach" ( "id_vracha" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "familiya" TEXT NOT NULL, "imya" TEXT NOT NULL, "otchestvo" TEXT NOT NULL, "login" TEXT, "parol" TEXT, "id_otdeleniya" INTEGER NOT NULL, "doljnost" TEXT NOT NULL, "kabinet" TEXT, "telefon" TEXT, "email" TEXT, CONSTRAINT "fkey0" FOREIGN KEY ("id_otdeleniya") REFERENCES "otdelenie" ("id_otdeleniya") ON DELETE CASCADE ON UPDATE CASCADE )

Создание таблицы врачей. Содержит информацию о врачах и идентификатор отделения, являющийся внешним ключем от таблицы отделений.

CREATE TABLE "palata" ( "id_palaty" INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL, "no_palaty" TEXT NOT NULL, "kol_mest" INTEGER )

Создание таблицы палат, которая не имеет внешних ключей.

CREATE TABLE "vypisannye_pacienty" ( "id_vyp_pac" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "id_karty" INTEGER NOT NULL, "data" TEXT NOT NULL, "vremya" TEXT NOT NULL, "otchet" TEXT NOT NULL, CONSTRAINT "fkey0" FOREIGN KEY ("id_karty") REFERENCES "karta" ("id_karty") ON DELETE CASCADE ON UPDATE CASCADE )

Таблица выписанных пациентов. Содержит в себе идентификаторы карт выписанных пациентов, дату и время их выписки и отчет о результатах лечения.


Для внесения новых данных в БД, используются SQL-выражения, соджержащие оператор INSERT. В таблице 3.2 изображены основные SQL-выражения для вставки новых записей в таблицы базы данных.

Таблица 3.2 - Основные SQL-вырадения вставки и изменения информации

Выражение

Описание

INSERT INTO karta (id_karty, data_sozd, id_vracha, id_pacienta, id_palaty, status) VALUES (:id_k,:d_sozd,:id_v,:id_pac,:id_pal,:st)

Вставка новой записи в таблицу карт.

INSERT INTO pacient(familiya, imya, otchestvo, pol, data_rojd, gorod, adres, telefon, email, data_dobavleniya, zametki)  VALUES (:fam,:im,:otch,:pol,:d_r,:gorod,:adres,:tel,:email,:d_dob,:zam)

Добавление новой записи в таблицу пациентов.

INSERT INTO vrach(familiya, imya, otchestvo, doljnost, id_otdeleniya, kabinet, telefon, email, login, parol)  VALUES (:fam,:im,:otch,:dolj,:id_otd,:kab,:tel,:email,:log,:pas)

Добавление новой записи в таблицу врачей.

INSERT INTO otdelenie (id_otdeleniya, name, telefon, email) VALUES (:id_otd,:name,:tel,:email)

Добавление нового отделения

INSERT INTO palata (no_palaty, kol_mest, id_palaty) VALUES (:no_p,:kol_m,:id_p)

Добавление новой палаты

INSERT INTO vypisannye_pacienty (id_karty, data, vremya, otchet) VALUES (:id_k,:date,:time,:otchet)

Выписка пациента из больницы

DELETE FROM pacient WHEHE id_pacienta =:id_p

Удаление пациента из БД. Т.к. таблица имеет каскадные связи, то удаляются и все данные, относящиеся к пациенту.

DELETE FROM vrach WHERE id_vracha =:id_v

Удаление врача

DELETE FROM otdelenie WHERE id_otdeleniya =:id_otd

Удаление отделения

DELETE FROM palata WHERE id_palaty =:id_p

Удаление палаты

DELETE FROM karta WHERE id_pacienta =:id_p

Удаление карты. Удаляются и все наблюдения, относящиеся к карте.


Вывод информации из БД на форму производитсья с помощью запросов. Основные SQL-запросы, используемые в программе, описаны в таблице 3.3.

Таблица 3.3 - Основные SQL-запросы программы

Выражение

Описание

SELECT DISTINCT familiya,imya,otchestvo,pol,data_rojd,gorod,adres,telefon,email,data_dobavleniya,zametki,id_pacienta FROM pacient WHERE id_pacienta!= 0 AND familiya

Запрос информации о всех пациентах, удовлетворяющих приведенным условиям. Запрос

LIKE '%%1%' AND imya LIKE '%%1%' AND otchestvo LIKE '%%1%' AND pol LIKE '%%1%'

используется в поиске.

 

SELECT DISTINCT familiya, imya, otchestvo, doljnost, id_otdeleniya, kabinet, telefon, email, login, parol, id_vracha FROM vrach WHERE id_vracha!=0 AND familiya LIKE '%%1%' AND imya LIKE '%%1%' AND otchestvo LIKE '%%1%' AND doljnost LIKE '%%1%'

Запрос информации о врачах, удовлетворяющих критериям поиска.

 

SELECT DISTINCT name, telefon, email, id_otdeleniya FROM otdelenie WHERE id_otdeleniya!=0 AND name LIKE '%%1%'

Запрос информации о всех отделениях или отделении с запрошенным названием.

 

SELECT DISTINCT no_palaty, kol_mest, id_palaty FROM palata WHERE id_palaty!=0 AND no_palaty LIKE '%%1%'

Запрос информации о всех палатах или о палате с определенным номером.

 

SELECT DISTINCT data_sozd, id_vracha, status, id_palaty, id_karty FROM karta WHERE id_pacienta =:pid

Запрос всех карт, записанных на данного пациента.

 

SELECT data, vremya, lekarstvo, dozirovka, procedura, analiz, rezultat, id_nabludeniya, id_karty  FROM nabludenie WHERE id_karty =:id_k

Запрос всех наблюдений по данной карте пациента.

 


4.     
Описание программы

4.1    Выбор и обоснование выбора среды разработки

Для выполнения поставленной задачи, потребовались мощные средства не только для доступа к данным БД, но одновременно с удобными инструментами разработки пользовательского интерфейса. На основании этих требований был произведен поиск среди существующих инструментарием разработки, таких как Microsoft Visual Studio 2010, Embarcadero C++ Builder 2010, Qt Creator 2.0.1, основанный на Qt версии 4.7.0. По причине отсутствия необходимости в подключении сторонних библиотек для работы с аудиофайлами, результате было отдано предпочтение Qt Creator 2.0.1 на Qt 4.7.0.

Обзор инструментария Qt

Qt  - кросс-платформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python - PyQt,  PySide; Ruby - QtRuby; Java - Qt Jambi; PHP - PHP-Qt и другие.

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

Существуют версии библиотеки для Microsoft Windows, систем класса UNIX с графической подсистемой X11, Mac OS X, Microsoft Windows CE, встраиваемых Linux-систем и платформы S60. Также идёт портирование на HaikuOS, iOS, Android.

До недавнего времени библиотека Qt также распространялась ещё в одной версии: Qt/Embedded. Теперь эта платформа переименована в Qtopia Core и распространяется как отдельный продукт. Qtopia Core обеспечивает базовую функциональность для всей линейки платформ, предназначенных для разработки приложений для встраиваемых и мобильных устройств (КПК, смартфонов и т. п.).

Начиная с версии 4.5 Qt распространяется по 3 лицензиям:

-       Qt Commercial - для разработки ПО с собственнической лицензией, допускающая модификацию самой Qt без раскрытия изменений.

-             GNU GPL - для разработки ПО с открытыми исходниками распространяемыми на условиях GNU GPL.GNU LGPL - для разработки ПО с собственнической лицензией, но без внесения изменений в Qt.

Независимо от лицензии, исходный код Qt один и тот же.

До версии 4.0.0 под свободной лицензией распространялись лишь Qt/Mac, Qt/X11, Qt/Embedded, но, начиная с 4.0.0 (выпущенной в конце июня 2005), Qt Software «освободили» и Qt/Windows. Следует отметить, что существовали сторонние свободные версии Qt/Windows < 4.0.0, сделанные на основе Qt/X11.

Со времени своего появления в 1996 году библиотека Qt легла в основу тысяч успешных проектов во всём мире. Кроме того, Qt является фундаментом популярной рабочей среды KDE, входящей в состав многих дистрибутивов Linux.

Отличительная особенность Qt от других библиотек - использование Meta Object Compiler (MOC) - предварительной системы обработки исходного кода (в общем-то, Qt - это библиотека не для чистого C++, а для его особого наречия, с которого и «переводит» MOC для последующей компиляции любым стандартным C++ компилятором). MOC позволяет во много раз увеличить мощь библиотек, вводя такие понятия, как слоты и сигналы. Кроме того, это позволяет сделать код более лаконичным. Утилита MOC ищет в заголовочных файлах на C++ описания классов, содержащие макрос Q_OBJECT, и создаёт дополнительный исходный файл на C++, содержащий мета-объектный код.позволяет создавать собственные плагины и размещать их непосредственно в панели визуального редактора. Также существует возможность расширения привычной функциональности виджетов, связанной с размещением их на экране, отображением, перерисовкой при изменении размеров окна.

Библиотека разделена на несколько модулей, для четвёртой версии библиотеки это:

-    QtCore - классы ядра библиотеки, используемые другими модулями;

-       QtGui - компоненты графического интерфейса;

-       QtNetwork - набор классов для сетевого программирования. Поддержка различных высокоуровневых протоколов может меняться от версии к версии. В версии 4.2.x присутствуют классы для работы с протоколами FTP и HTTP. Для работы с протоколами TCP/IP предназначены такие классы, как QTcpServer, QTcpSocket для TCP и QUdpSocket для UDP;

-       QtOpenGL - набор классов для работы с OpenGL;

-       QtSql - набор классов для работы с базами данных с использованием языка структурированных запросов SQL. Основные классы данного модуля в версии 4.2.х: QSqlDatabase - класс для предоставления соединения с базой, для работы с какой-нибудь конкретной базой данных требует объект, унаследованный от класса QSqlDriver - абстрактного класса, который реализуется для конкретной базы данных и может требовать для компиляции SDK базы данных. Например, для сборки драйвера под базу данных FireBird/InterBase требует.h файлы и библиотеки статической линковки, входящие в комплект поставки данной БД;

-       QtScript - классы для работы с Qt Scripts;

-       QtSvg - классы для отображения и работы с данными Scalable Vector Graphics(SVG);

-       QtXml - модуль для работы с XML, поддерживается SAX и DOM модели работы;

-       QtDesigner - классы создания расширений QtDesigner’а для своих собственных виджетов;

-       QtUiTools - классы для обработки в приложении форм Qt Designer;

-       QtAssistant - справочная система;

-       Qt3Support - модуль с классами, необходимыми для совместимости с библиотекой Qt версии 3.х.х;

-       QtTest - модуль для работы с UNIT тестами;

-       QtWebKit - модуль WebKit, интегрированный в Qt и доступный через её классы;

-       QtXmlPatterns - модуль для поддержки XQuery 1.0 и XPath 2.0;

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

-       QtCLucene - модуль для поддержки полнотекстового поиска, применяется в новой версии Assistant в Qt 4.4;

-       ActiveQt - модуль для работы с ActiveX и COM технологиями для Qt-разработчиков под Windows.

-       QtDeclarative - модуль, предоставляющий декларативный фреймворк для создания динамичных, настраеваемых пользовательских интерфейсов.

-    также реализована технология WoC - widgets on canvas, с помощью которой реализована Plasma в KDE 4.1, Будет возможным использовать виджеты библиотеки Qt прямо в аплетах. Обеспечивает расположение виджетов на QGraphicsView с возможностью масштабирования и различных графических эффектов.

Библиотека использует собственный формат проекта, именуемый.pro файлом, в котором собрана информация о том, какие файлы будут скомпилированы, по каким путям искать заголовочные файлы и много другой информации. Впоследствии при помощи утилиты qmake из них получаются makefile для make-утилиты компилятора. Также есть возможность работы при помощи интеграторов с Microsoft Visual Studio 2003/2005/2008/2010. Совсем недавно стала доступна интеграция в Eclipse для версии библиотеки 4.х.х.

Разработчики на Java могут использовать Qt с помощью фреймворка Qt Jambi от того же производителя (официально с 2009 года Qt Software прекратила разработку этого фреймворка).

Одним из весомых преимуществ проекта Qt является наличие качественной документации, в отличие, например, от wxWidgets. Статьи документации снабжены большим количеством примеров. Исходный код самой библиотеки хорошо форматирован, подробно комментирован и легко читается, что также упрощает изучение Qt.

Исходный код, единый для всех вариантов лицензий, свободно доступен в Git-хранилище. Кроме самого исходного кода Qt, на Gitorious-е расположены хранилища сопутствующих библиотек разрабатываемых авторами библиотеки и сообществом. Для внесения собственного вклада в развитие Qt, можно склонировать официальное хранилище, внести необходимые исправления/улучшения в код, а затем подать запрос на объединение (Merge Request) ваших изменений с официальным кодом.

4.2    Описание внутренней структуры программы

Программа представляет собой набор классов, реализующие соответствующие элементы ее интерфейса. Этот прием характерен для большинства Qt-приложений, и он является наиболее приемлемым при разработке. Обмен данными осуществляется путем посылки сигнала одним и реагирования на соответствующий сигнал другим объектом.

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

Напротив иерархии классов, широко используется агрегирование как средство управления компонентами интерфейса. Большинство действий выполняется именно через доступ к агрегируемым экземплярам.

Главное окно

Представлено классом MainWindow, который является наследником встроенного класса QMainWindow.

Внешний вид главного окна программы изображен на рисунке 4.1.

Рисунок 4.1 - Главное окно

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

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

Конструктора класса имеет вид:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent){();();

}

В закрытых полях класса имеется только один элемент autorization *autorizationWidget, необходимый для осуществления связи с оном авторизации.

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

Более важную функцию несут слоты MainWindow. Слоты подробно описаны в таблице 4.1.

Таблица 4.1 - Слоты класса MainWindow

Слот

Описание

void on_actionAdd_activated()

Добавляет пустую строку в таблицу на активной в данный момент вкладке.

void on_actionDell_activated();

Удаляет выделенную строку из таблицы и БД на активной в данный момент вкладке

void on_actionApply_activated();

Сохраняет все изменения в таблицах в БД.

void on_actionRefresh_activated();

Обновляет таблицу, т.е. загружает данные из БД.

void on_tableWidget_patient_itemSelectionChanged();

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

void on_tabWidget_currentChanged(QWidget*)

Принимает индекс активной вкладки и отображает информацию из БД в соответствующея таблице.

void on_action_search_triggered();

Отвечает за поиск по введенным критериям.

void on_actionChangeUser_activated();

Вызывает окошко авторизации.

void on_pushButton_vypisat_clicked();

Вызывает диалог выбора файла, используемого в качестве отчета о результате лечения.

void on_pushButton_infoVypisannogo_clicked();

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

 

Окно наблюдений за пациентом

Окно содержит информацию о наблюдениях по конкретному поступлению пациента в больницу. Внешний вид окна показан на рисунке 4.2.

Рисунок 4.2 - Внешний вид окна наблюдений за пациентом

Конструктора класса Supervision имеет соледующий вид:

Supervision::Supervision(QWidget *parent): QWidget(parent),(new Ui::Supervision){>setupUi(this);>tableWidget->setSelectionMode(QAbstractItemView::MultiSelection);>tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget->hideColumn(7);>tableWidget->hideColumn(8);

}

Класс имеет одно поле id_karty, которое хранит идентификатор карты, вызвавшей таблицу наблюдений.

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

Метод void refresh() выполняет запрос всех данных о наблюдениях для карты, вызвавшей таблицу наблюдений.

Слоты класса используются для реагорования на базовые сигналы формы. Их описание представлено в таблице 4.2.

Таблица 4.2 - Основные слоты класса Supervision

Слот

Описание

void on_buttonAdd_clicked()

Добавляет пустую строку в таблицу.

void on_buttonDelete_clicked()

Удаляет выделенную строку из БД и таблицы.

void on_buttonApply_clicked()

Сохраняет изменеия в таблице в БД.

void on_buttonRefresh_clicked()

Обновляет информацию в таблице, заново загружая данные из БД.


Окно авторизации


Вызывается при нажатии соответствующей кнопки на панели инструментов главного окна программмы. Окно авторизации изображено на рисунке 4.3.

Рисунок 4.3 - Окно авторизации

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

Класс имеет два слота void on_pushButton_Enter_clicked() и void on_pushButton_Out_clicked(), отвечающих за обработку события нажатия кнопок. Также он имеет сигнал void authorization_successfull(bool), сообщающий классу главного окна программы о том, успешно или нет прошла авторизация пользователя. Если полученные логи и пароль содержатся в базе данных, то появляется сообщение об успешной авторизации, показанное на рисунке 4.4.

Рисунок 4.4 - Сообщение об успешной авторизации

 

4.3    Программно-аппаратные ресурсы ПК

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

Системные требования к программному средству «Кулинарная книга» следующие:


Минимальные

Рекомендуемые

Процессор

233 MHz

300 MHz или выше

Оперативная память

128 Мб RAM

256 Мб RAM и выше

Видеоадаптер и монитор

Super VGA (800 x 600)

Super VGA (800 x 600) или выше

Свободное место на HDD

1.5 Гб

1.5 Гб или больше

Устройства взаимодействия с пользователем

Клавиатура и мышь

Клавиатура и мышь

Требования к программным ресурсам

Для сборки и полноценной работы программы необходима установка следующих программных зависимостей:

-                  Драйвер базы данных SQLITE;

-        Компилятор gcc;

         Утилита GNU make.

5.     
Тестирование


Тестирование программного продукта проводилось на операционной системе Windows 7 Максимальная x32.

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

Рисунок 5.1 - Сообщение о неверном логине или пароле

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

Рисунок 5.2 - Отображение данных по запросу на поиск всех пациентов мужского пола

При выборе карты пациента и нажатии на кнопку «Выписать пациента» появляется диалоговое окно запроса пути к документу-отчету о лечении. Окно показано на рисунке 5.3.

Рисунок 5.3 - окно запроса пути к файлу-отчету о результате лечения

При выборе файла и нажатии кнопки «Открыть» в БД добавляется запись в таблицу Выписанные пациенты. В записи содержится дата и время выписки, идентификатор карты пациента, для которого была вызвана команда «Выписать пациента» и путь к выбранному файлу-отчету. Запись карты теперь отображается синим цветом (рис. 5.4).

Рисунок 5.4 - Отображение другим цветом карт выписанных пациентов

При нажатии кнопки «Общий диагноз и результат лечения выписанного пациента» открывается загруженный ранее файл-отчет.

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

6.      Применение


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

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

Рисунок 6.1 - Панель инструментов программы

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

Переход между вкладками осуществляется путем нажания на название вкладки.

Первая вкладка предназначена для просмотра информации о всех пациентов. Она отображается по умолчанию в главном окне при запуске программы. Внешний вид вкладки показан на рисунке 6.2.

Рисунок 6.2 - Вкладка просмотра информации о пациентах

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

Рисунок 6.3 - Кнопки управления данными о поступлениях пациента в больницу

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

Вторая вкладка предназначена для просмотра информации о врачах. Ее внешний вид показан на рисунке 6.4.

Рисунок 6.4 - Виджет просмотра информации о врачах

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

Внешний вид виджета изображен на рисунке 6.5.

Рисунок 6.5 - Вкладка просмотра информации об отделениях

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

Рисунок 6.6 - Внешний вид вкладки просмотра информации о палатах

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

Рисунок 6.7 - Отображение наблюдений за пациентом

Поиск осуществляется на активной в данный момент вкладке путем ввода в соответствующие поля критериев поиска и нажатия соответствующей кнопки на панели инструментов, либо комбинации клавиш Ctrl+F. Результаты поиска отображаются на вкладках главного окна программы. Результат поиска отображен на рисунке 6.8.

Рисунок 6.8 - Отображение результатов поиска

 


Заключение


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

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

Организация базы данных файлового типа (SQLITE) позволяет в дальнейшем разработать средства экспортирования, импортирования и синхронизации пользовательских библиотек. Это позволит организовать обмен информацией между несколькими пользователями, что в разы увеличивает преимущество программы перед ее конкурентами.

Разработанное ПС вдальнейшем может быть улучшено путем реализации новых функций, например предоставление статистической информации, разработка хорошей системы защиты информации (кодирование информации в БД) и т.п.

Приложение А

интерфейс база программный

Диаграмма классов




Приложение Б

ER-диаграмма



Приложение В

Текст программы

main.cpp

#include <QtGui/QApplication>

#include "mainwindow.h"

#include "connection.h"main(int argc, char *argv[])

{a(argc, argv);(!createConnection())1;w;.show();a.exec();

}

.h

#ifndef CONNECTION_H

#define CONNECTION_H

#include <QMessageBox>

#include <QSqlDatabase>

#include <QSqlError>

#include <QSqlQuery>bool createConnection(){db = QSqlDatabase::addDatabase("QSQLITE");.setDatabaseName("QPH");(!db.open()) {::critical(0, qApp->tr("Cannot open database"),

"Unable to establish a database connection.\n"

"This example needs SQLite support. Please read "

"the Qt SQL driver documentation for information how "

"to build it.\n\n"

"Click Cancel to exit.", QMessageBox::Cancel);false;

}true;

}

#endif

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QModelIndex>

#include <QTableWidgetItem>

#include "ui_supervision.h"

#include "autorization.h"Ui {MainWindow;

}MainWindow: public QMainWindow{_OBJECT;:refreshKartaWidget(int id_pac);refreshPatientWidget();refreshVrachWidget();refreshOtdelenieWidget();refreshPalataWidget();(QWidget *parent = 0);setupDb();

~MainWindow();:::MainWindow *ui;*autorizationWidget;slots:on_tableWidget_karta_itemDoubleClicked(QTableWidgetItem* item);on_action_search_triggered();on_tabWidget_currentChanged(QWidget*);on_pushButton_infoVypisannogo_clicked();on_pushButton_vypisat_clicked();on_actionRefresh_activated();on_pushButton_refresh_karta_clicked();on_actionChangeUser_activated();on_actionApply_activated();on_actionDell_activated();on_actionAdd_activated();on_pushButton_del_karta_clicked();on_pushButton_add_karta_clicked();on_pushButton_ap_karta_clicked();on_tableWidget_patient_itemSelectionChanged();setControlsEnabled(bool en);

};

#endif // MAINWINDOW_H

.cpp

#include <QSqlQuery>

#include <QtGui/QTableWidget>

#include <QtGui/QAbstractItemView>

#include <QDateTime>

#include <QDate>

#include <QAbstractItemDelegate>

#include <QComboBox>

#include <QFileDialog>

#include <QColor>

#include <QCursor>

#include <QProcess>

#include <QDialogButtonBox>

#include <QRect>

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include "ui_supervision.h"

#include "supervision.h"

#include "connection.h"

#include "itemdelegate.h"::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){>setupUi(this);>tableWidget_patient->setSelectionMode(QAbstractItemView::SingleSelection);>tableWidget_patient->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget_patient->setItemDelegateForColumn(3, new ItemDelegate());>tableWidget_karta->setSelectionMode(QAbstractItemView::SingleSelection);>tableWidget_karta->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget_karta->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget_karta->setItemDelegateForColumn(1, new forVrachDelegate());>tableWidget_karta->setItemDelegateForColumn(3, new forPalatyDelegate());>tableWidget_karta->setItemDelegateForColumn(2, new forStatusDelegate());>tableWidget_vrach->setSelectionMode(QAbstractItemView::SingleSelection);>tableWidget_vrach->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget_vrach->setItemDelegateForColumn(4, new forOtdelenieDelegate());>tableWidget_otdeleniya->setSelectionMode(QAbstractItemView::SingleSelection);>tableWidget_otdeleniya->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget_palaty->setSelectionMode(QAbstractItemView::SingleSelection);>tableWidget_palaty->setSelectionBehavior(QAbstractItemView::SelectRows);>tabWidget->setCurrentIndex(0);>SearchLabel1->setText(QString::fromLocal8Bit("Фамилия"));>SearchLabel2->setText(QString::fromLocal8Bit("Имя"));>SearchLabel3->setText(QString::fromLocal8Bit("Отчество"));>SearchLabel4->setText(QString::fromLocal8Bit("Пол"));>SearchLabel5->setVisible(false);>SearchEdit4->setVisible(false);>SearchLabel2->setVisible(true);>SearchLabel3->setVisible(true);>SearchLabel4->setVisible(true);>SearchEdit2->setVisible(true);>SearchEdit3->setVisible(true);>SearchCBox1->setVisible(true);>pushButton_add_karta->setEnabled(false);>pushButton_del_karta->setEnabled(false);>pushButton_ap_karta->setEnabled(false);>pushButton_refresh_karta->setEnabled(false);>pushButton_vypisat->setEnabled(false);>centralWidget->setGeometry(QRect(41,0,1300,641));>tableWidget_patient->hideColumn(11);>tableWidget_vrach->hideColumn(9);>tableWidget_vrach->hideColumn(10);>tableWidget_karta->hideColumn(4);>tableWidget_otdeleniya->hideColumn(3);>tableWidget_palaty->hideColumn(2);();

}

}1:{>SearchLabel1->setText(QString::fromLocal8Bit("Фамилия"));>SearchLabel2->setText(QString::fromLocal8Bit("Имя"));>SearchLabel3->setText(QString::fromLocal8Bit("Отчество"));>SearchLabel5->setText(QString::fromLocal8Bit("Должность"));>SearchLabel4->setVisible(false);>SearchCBox1->setVisible(false);>SearchLabel2->setVisible(true);>SearchLabel3->setVisible(true);>SearchLabel5->setVisible(true);>SearchEdit2->setVisible(true);>SearchEdit3->setVisible(true);>SearchEdit4->setVisible(true);;

}2:{>SearchLabel1->setText(QString::fromLocal8Bit("Название отделения"));>SearchLabel2->setVisible(false);>SearchLabel3->setVisible(false);>SearchLabel4->setVisible(false);>SearchLabel5->setVisible(false);>SearchEdit2->setVisible(false);>SearchEdit3->setVisible(false);>SearchEdit4->setVisible(false);>SearchCBox1->setVisible(false);;

}3:{>SearchLabel1->setText(QString::fromLocal8Bit("Номер палаты"));>SearchLabel2->setVisible(false);>SearchLabel3->setVisible(false);>SearchLabel4->setVisible(false);>SearchLabel5->setVisible(false);>SearchEdit2->setVisible(false);>SearchEdit3->setVisible(false);>SearchEdit4->setVisible(false);>SearchCBox1->setVisible(false);;

}:;

}

}::~MainWindow(){ui;

}MainWindow::setControlsEnabled(bool en){>actionAdd->setEnabled(en);>actionDell->setEnabled(en);>actionApply->setEnabled(en);>actionRefresh->setEnabled(en);

}

//void MainWindow::setIdUsersVrach (int id){

// idUsersVrach = id;

//}

//обновить таблицу пациентовMainWindow::refreshPatientWidget(){(int i = ui->tableWidget_patient->rowCount()-1; i >=0; i--){>tableWidget_patient->removeRow(i);

}query;sqlToBild = "SELECT DISTINCT familiya,imya,otchestvo,pol,data_rojd,gorod,adres,telefon,email,data_dobavleniya,zametki,id_pacienta FROM pacient WHERE id_pacienta!= 0 ";.append (ui->SearchEdit1->text().isEmpty()? "": QString("AND familiya LIKE '%%1%' ").arg(ui->SearchEdit1->text()));.append (ui->SearchEdit2->text().isEmpty()? "": QString("AND imya LIKE '%%1%' ").arg(ui->SearchEdit2->text()));.append (ui->SearchEdit3->text().isEmpty()? "": QString("AND otchestvo LIKE '%%1%' ").arg(ui->SearchEdit3->text()));.append (ui->SearchCBox1->currentText().isNull()? "": QString("AND pol LIKE '%%1%' ").arg(ui->SearchCBox1->currentText()));QString sql = sqlToBild;.exec(sql);(query.next()){rows = ui->tableWidget_patient->rowCount();>tableWidget_patient->insertRow(rows);>tableWidget_patient->setItem(rows, 0, new QTableWidgetItem(query.value(0).toString()));>tableWidget_patient->setItem(rows, 1, new QTableWidgetItem(query.value(1).toString()));>tableWidget_patient->setItem(rows, 2, new QTableWidgetItem(query.value(2).toString()));>tableWidget_patient->setItem(rows, 3, new QTableWidgetItem(query.value(3).toString()));>tableWidget_patient->setItem(rows, 4, new QTableWidgetItem(query.value(4).toString()));>tableWidget_patient->setItem(rows, 5, new QTableWidgetItem(query.value(5).toString()));>tableWidget_patient->setItem(rows, 6, new QTableWidgetItem(query.value(6).toString()));>tableWidget_patient->setItem(rows, 7, new QTableWidgetItem(query.value(7).toString()));>tableWidget_patient->setItem(rows, 8, new QTableWidgetItem(query.value(8).toString()));>tableWidget_patient->setItem(rows, 9, new QTableWidgetItem(query.value(9).toString()));>tableWidget_patient->setItem(rows, 10, new QTableWidgetItem(query.value(10).toString()));>tableWidget_patient->setItem(rows, 11, new QTableWidgetItem(query.value(11).toString()));

}

}

////обновить таблицу врачейMainWindow::refreshVrachWidget(){(int i = ui->tableWidget_vrach->rowCount()-1; i >=0; i--){>tableWidget_vrach->removeRow(i);

}query;sqlToBild = "SELECT DISTINCT familiya, imya, otchestvo, doljnost, id_otdeleniya, kabinet, telefon, email, login, parol, id_vracha FROM vrach WHERE id_vracha!=0 ";.append (ui->SearchEdit1->text().isEmpty()? "": QString("AND familiya LIKE '%%1%' ").arg(ui->SearchEdit1->text()));.append (ui->SearchEdit2->text().isEmpty()? "": QString("AND imya LIKE '%%1%' ").arg(ui->SearchEdit2->text()));.append (ui->SearchEdit3->text().isEmpty()? "": QString("AND otchestvo LIKE '%%1%' ").arg(ui->SearchEdit3->text()));.append (ui->SearchEdit4->text().isEmpty()? "": QString("AND doljnost LIKE '%%1%' ").arg(ui->SearchEdit4->text()));QString sql = sqlToBild;.exec(sql);(query.next()){rows = ui->tableWidget_vrach->rowCount();>tableWidget_vrach->insertRow(rows);>tableWidget_vrach->setItem(rows, 0, new QTableWidgetItem(query.value(0).toString()));>tableWidget_vrach->setItem(rows, 1, new QTableWidgetItem(query.value(1).toString()));>tableWidget_vrach->setItem(rows, 2, new QTableWidgetItem(query.value(2).toString()));>tableWidget_vrach->setItem(rows, 3, new QTableWidgetItem(query.value(3).toString()));sql;.prepare("SELECT DISTINCT name FROM otdelenie WHERE id_otdeleniya ==:id_otd");.bindValue(0,query.value(4).toInt());.exec();(sql.next())>tableWidget_vrach->setItem(rows, 4, new QTableWidgetItem(sql.value(0).toString()));>tableWidget_vrach->setItem(rows, 5, new QTableWidgetItem(query.value(5).toString()));>tableWidget_vrach->setItem(rows, 6, new QTableWidgetItem(query.value(6).toString()));>tableWidget_vrach->setItem(rows, 7, new QTableWidgetItem(query.value(7).toString()));>tableWidget_vrach->setItem(rows, 8, new QTableWidgetItem(query.value(8).toString()));>tableWidget_vrach->setItem(rows, 9, new QTableWidgetItem(query.value(9).toString()));>tableWidget_vrach->setItem(rows, 10, new QTableWidgetItem(query.value(10).toString()));

}

}

////обновить таблицу отделенийMainWindow::refreshOtdelenieWidget(){(int i = ui->tableWidget_otdeleniya->rowCount()-1; i >=0; i--){>tableWidget_otdeleniya->removeRow(i);

}query;sqlToBild = "SELECT DISTINCT name, telefon, email, id_otdeleniya FROM otdelenie WHERE id_otdeleniya!=0 ";.append (ui->SearchEdit1->text().isEmpty()? "": QString("AND name LIKE '%%1%' ").arg(ui->SearchEdit1->text()));QString sql = sqlToBild;.exec(sql);(query.next()){rows = ui->tableWidget_otdeleniya->rowCount();>tableWidget_otdeleniya->insertRow(rows);>tableWidget_otdeleniya->setItem(rows,0, new QTableWidgetItem(query.value(0).toString()));>tableWidget_otdeleniya->setItem(rows,1, new QTableWidgetItem(query.value(1).toString()));>tableWidget_otdeleniya->setItem(rows,2, new QTableWidgetItem(query.value(2).toString()));>tableWidget_otdeleniya->setItem(rows,3, new QTableWidgetItem(query.value(3).toString()));

}

}

////обновить таблицу палатMainWindow::refreshPalataWidget(){(int i = ui->tableWidget_palaty->rowCount()-1; i >=0; i--){>tableWidget_palaty->removeRow(i);

}query;sqlToBild = "SELECT DISTINCT no_palaty, kol_mest, id_palaty FROM palata WHERE id_palaty!=0 ";.append(ui->SearchEdit1->text().isEmpty()? "": QString("AND no_palaty LIKE '%%1%' ").arg(ui->SearchEdit1->text()));QString sql = sqlToBild;.exec(sql);(query.next()){rows = ui->tableWidget_palaty->rowCount();>tableWidget_palaty->insertRow(rows);>tableWidget_palaty->setItem(rows, 0, new QTableWidgetItem(query.value(0).toString()));>tableWidget_palaty->setItem(rows, 1, new QTableWidgetItem(query.value(1).toString()));>tableWidget_palaty->setItem(rows, 2, new QTableWidgetItem(query.value(2).toString()));

}

}MainWindow::setupDb(){();();();();

}

// обновить карты пациентовMainWindow::refreshKartaWidget(int id_pac){(int i = ui->tableWidget_karta->rowCount(); i >=0; i--){>tableWidget_karta->removeRow(i);

}query;.prepare("SELECT DISTINCT data_sozd, id_vracha, status, id_palaty, id_karty FROM karta WHERE id_pacienta =:pid");.bindValue(0, id_pac);.exec();(query.next()){rows = ui->tableWidget_karta->rowCount();>tableWidget_karta->insertRow(rows);>tableWidget_karta->setItem(rows, 0, new QTableWidgetItem(query.value(0).toString()));sql;.prepare("SELECT DISTINCT familiya FROM vrach WHERE id_vracha ==:id_v");.bindValue(0,query.value(1).toInt());.exec();(sql.next())>tableWidget_karta->setItem(rows, 1, new QTableWidgetItem(sql.value(0).toString()));>tableWidget_karta->setItem(rows, 2, new QTableWidgetItem(query.value(2).toString()));.prepare("SELECT DISTINCT no_palaty FROM palata WHERE id_palaty ==:id_p");.bindValue(0,query.value(3).toInt());.exec();(sql.next())>tableWidget_karta->setItem(rows, 3, new QTableWidgetItem(sql.value(0).toString()));>tableWidget_karta->setItem(rows, 4, new QTableWidgetItem(query.value(4).toString()));

}.exec("SELECT id_karty FROM vypisannye_pacienty");(query.next()){(int i = 0; i < ui->tableWidget_karta->rowCount(); i++){id_karty = ui->tableWidget_karta->item(i, 4)->text();(query.value(0).toString() == id_karty){>tableWidget_karta->item(i,0)->setBackgroundColor(Qt::darkCyan);>tableWidget_karta->item(i,1)->setBackgroundColor(Qt::darkCyan);>tableWidget_karta->item(i,2)->setBackgroundColor(Qt::darkCyan);>tableWidget_karta->item(i,3)->setBackgroundColor(Qt::darkCyan);

}

}

}

}

//отображение карт пациентовMainWindow::on_tableWidget_patient_itemSelectionChanged(){(!ui->tableWidget_patient->selectionModel()->selectedIndexes().isEmpty()){row = ui->tableWidget_patient->selectionModel()->selectedIndexes()[0].row();patient_id = ui->tableWidget_patient->item(row,11)->text().toInt();(patient_id);(ui->actionAdd->isEnabled()){>pushButton_add_karta->setEnabled(true);>pushButton_del_karta->setEnabled(true);>pushButton_ap_karta->setEnabled(true);>pushButton_refresh_karta->setEnabled(true);>pushButton_vypisat->setEnabled(true);

}

}

}

//сохранить изменения в таблице карт пациентов

void MainWindow::on_pushButton_ap_karta_clicked(){row = ui->tableWidget_patient->selectionModel()->selectedIndexes()[0].row();id_pac = ui->tableWidget_patient->item(row,11)->text().toInt();query;.prepare("DELETE FROM karta WHERE id_pacienta =:id_p");.bindValue(0,id_pac);.exec();(int i = 0; i < ui->tableWidget_karta->rowCount(); i++){data_sozd = ui->tableWidget_karta->item(i,0)->text();id_vrach;famVracha = ui->tableWidget_karta->item(i,1)->text();.prepare("SELECT DISTINCT id_vracha FROM vrach WHERE familiya ==:fam");.bindValue(0, famVracha);.exec();(query.next())_vrach = query.value(0).toInt();status = ui->tableWidget_karta->item(i,2)->text();no_palaty = ui->tableWidget_karta->item(i,3)->text();id_palaty;.prepare("SELECT DISTINCT id_palaty FROM palata WHERE no_palaty ==:no_p ");.bindValue(0,no_palaty);.exec();(query.next())_palaty = query.value(0).toInt();id_karty = ui->tableWidget_karta->item(i,4)->text();.prepare("INSERT INTO karta (id_karty, data_sozd, id_vracha, id_pacienta, id_palaty, status)"

"VALUES (:id_k,:d_sozd,:id_v,:id_pac,:id_pal,:st)");.bindValue(0,id_karty);.bindValue(1,data_sozd);.bindValue(2,id_vrach);.bindValue(3,id_pac);.bindValue(4,id_palaty);.bindValue(5,status);.exec();

}(id_pac);

}

//добавление пустой записи в таблицу карт пациента

void MainWindow::on_pushButton_add_karta_clicked(){rows = ui->tableWidget_karta->rowCount();>tableWidget_karta->insertRow(rows);(int i = 0; i < ui->tableWidget_karta->columnCount(); i++)>tableWidget_karta->setItem(rows, i, new QTableWidgetItem());date = QDate().currentDate();>tableWidget_karta->item(rows, 0)->setText(date.toString("dd.MM.yyyy"));query;.prepare("SELECT familiya FROM vrach WHERE id_vracha =:id_v");

// query.bindValue(0,idUsersVrach);.exec();(query.next())>tableWidget_karta->item(rows, 1)->setText(query.value(0).toString());

}

////удаление записи из таблицы карт пациента

void MainWindow::on_pushButton_del_karta_clicked(){(!ui->tableWidget_karta->selectionModel()->selectedIndexes().isEmpty()){rows = ui->tableWidget_karta->selectionModel()->selectedIndexes()[0].row();id_karty = ui->tableWidget_karta->item(rows, 4)->text().toInt();query;.prepare("DELETE FROM karta WHERE id_karty =:id_k");.bindValue("id_k", id_karty);.exec();>tableWidget_karta->removeRow(rows);

}

}

//добавить строку на главном окнеMainWindow::on_actionAdd_activated(){indexPage = ui->tabWidget->currentIndex();(indexPage){0:{rows = ui->tableWidget_patient->rowCount();>tableWidget_patient->insertRow(rows);(int i = 0; i < ui->tableWidget_patient->columnCount(); i++)>tableWidget_patient->setItem(rows, i, new QTableWidgetItem());date = QDate().currentDate();>tableWidget_patient->item(rows, 9)->setText(date.toString("dd.MM.yyyy"));;

}1:{rows = ui->tableWidget_vrach->rowCount();>tableWidget_vrach->insertRow(rows);(int i = 0; i < ui->tableWidget_vrach->columnCount(); i++)>tableWidget_vrach->setItem(rows, i, new QTableWidgetItem());;

}2:{rows = ui->tableWidget_otdeleniya->rowCount();>tableWidget_otdeleniya->insertRow(rows);(int i = 0; i < ui->tableWidget_otdeleniya->columnCount(); i++)>tableWidget_otdeleniya->setItem(rows, i, new QTableWidgetItem());;

}3:{rows = ui->tableWidget_palaty->rowCount();>tableWidget_palaty->insertRow(rows);(int i = 0; i < ui->tableWidget_palaty->columnCount(); i++)>tableWidget_palaty->setItem(rows, i, new QTableWidgetItem());

break;

}:;

}

}

//удаление записи в главном окне

void MainWindow::on_actionDell_activated(){indexPage = ui->tabWidget->currentIndex();query;(indexPage){0:{(!ui->tableWidget_patient->selectionModel()->selectedIndexes().isEmpty()){rows = ui->tableWidget_patient->selectionModel()->selectedIndexes()[0].row();id_pacienta = ui->tableWidget_patient->item(rows, 11)->text().toInt();.prepare("DELETE FROM pacient WHERE id_pacienta =:id_pac");.bindValue("id_pac", id_pacienta);.exec();.prepare("DELETE FROM nabludenie WHERE id_karty IN (SELECT id_karty FROM karta WHERE id_pacienta =:id_pac)");//удаление наблюдений за удаляемым пациентом.bindValue(0,id_pacienta);.exec();.prepare("DELETE FROM karta WHERE id_pacienta =:id_pac");//удалить в картах записи на удаляемого пациента.bindValue("id_pac", id_pacienta);.exec();>tableWidget_patient->removeRow(rows);;

}

}1:{(!ui->tableWidget_vrach->selectionModel()->selectedIndexes().isEmpty()){rows = ui->tableWidget_vrach->selectionModel()->selectedIndexes()[0].row();id_vracha = ui->tableWidget_vrach->item(rows, 10)->text().toInt();.prepare("DELETE FROM vrach WHERE id_vracha =:id_v");.bindValue("id_v", id_vracha);.exec();>tableWidget_vrach->removeRow(rows);;

}

}2:{(!ui->tableWidget_otdeleniya->selectionModel()->selectedIndexes().isEmpty()){rows = ui->tableWidget_otdeleniya->selectionModel()->selectedIndexes()[0].row();id_otdeleniya = ui->tableWidget_otdeleniya->item(rows, 3)->text().toInt();.prepare("DELETE FROM otdelenie WHERE id_otdeleniya =:id_otd");.bindValue("id_otd", id_otdeleniya);.exec();>tableWidget_otdeleniya->removeRow(rows);;

}

}3:{(!ui->tableWidget_palaty->selectionModel()->selectedIndexes().isEmpty()){rows = ui->tableWidget_palaty->selectionModel()->selectedIndexes()[0].row();id_palaty = ui->tableWidget_palaty->item(rows, 2)->text();.prepare("DELETE FROM palata WHERE id_palaty =:id_pal");.bindValue("id_pal", id_palaty);.exec();>tableWidget_palaty->removeRow(rows);

break;

}

}:;

}

}

//сохранить изменения в таблице главного окна

void MainWindow::on_actionApply_activated(){indexPage = ui->tabWidget->currentIndex();query;(indexPage){0:{(int i=0; i<ui->tableWidget_patient->rowCount(); i++){id_pac = ui->tableWidget_patient->item(i,11)->text().toInt();.prepare("DELETE FROM pacient WHEHE id_pacienta =:id_p");.bindValue(0, id_pac);.exec();

}(int i = 0; i < ui->tableWidget_patient->rowCount(); i++){fam = ui->tableWidget_patient->item(i, 0)->text();imya = ui->tableWidget_patient->item(i, 1)->text();otch = ui->tableWidget_patient->item(i, 2)->text();pol = ui->tableWidget_patient->item(i, 3)->text();data_rojd = ui->tableWidget_patient->item(i, 4)->text();gorod = ui->tableWidget_patient->item(i, 5)->text();adres = ui->tableWidget_patient->item(i, 6)->text();telefon = ui->tableWidget_patient->item(i, 7)->text();email = ui->tableWidget_patient->item(i, 8)->text();data_dobav = ui->tableWidget_patient->item(i, 9)->text();zametki = ui->tableWidget_patient->item(i, 10)->text();id_pac = ui->tableWidget_patient->item(i, 11)->text();.prepare("INSERT INTO pacient(familiya, imya, otchestvo, pol, data_rojd, gorod, adres, telefon, email, data_dobavleniya, zametki, id_pacienta) VALUES (:fam,:im,:otch,:pol,:d_r,:gorod,:adres,:tel,:email,:d_dob,:zam,:id_pac)");.bindValue(0,fam);.bindValue(1, imya);.bindValue(2, otch);.bindValue(3, pol);.bindValue(4, data_rojd);.bindValue(5, gorod);.bindValue(6, adres);.bindValue(7, telefon);.bindValue(8, email);.bindValue(9, data_dobav);.bindValue(10, zametki);.bindValue(11, id_pac);.exec();

}();;

}1:{(int i = 0; i<ui->tableWidget_vrach->rowCount(); i++){id_vracha = ui->tableWidget_vrach->item(i, 10)->text().toInt();.prepare("DELETE FROM vrach WHERE id_vracha =:id_v");.bindValue(0,id_vracha);.exec();

}(int i = 0; i < ui->tableWidget_vrach->rowCount(); i++){fam = ui->tableWidget_vrach->item(i, 0)->text();imya = ui->tableWidget_vrach->item(i, 1)->text();otch = ui->tableWidget_vrach->item(i, 2)->text();dolj = ui->tableWidget_vrach->item(i, 3)->text();id_otdel;.prepare("SELECT DISTINCT id_otdeleniya FROM otdelenie WHERE name ==:name");.bindValue(0, ui->tableWidget_vrach->item(i, 4)->text());.exec();(query.next())_otdel = query.value(0).toInt();kab = ui->tableWidget_vrach->item(i, 5)->text();tel = ui->tableWidget_vrach->item(i, 6)->text();email = ui->tableWidget_vrach->item(i, 7)->text();login = ui->tableWidget_vrach->item(i, 8)->text();pas = ui->tableWidget_vrach->item(i, 9)->text();id_vracha = ui->tableWidget_vrach->item(i, 10)->text();.prepare("INSERT INTO vrach(familiya, imya, otchestvo, doljnost, id_otdeleniya, kabinet, telefon, email, login, parol, id_vracha) VALUES (:fam,:im,:otch,:dolj,:id_otd,:kab,:tel,:email,:log,:pas,:id_v)");.bindValue(":fam",fam);.bindValue("im", imya);.bindValue(":otch", otch);.bindValue(":dolj", dolj);.bindValue(":id_otdel", id_otdel);.bindValue(":kab", kab);.bindValue(":tel", tel);.bindValue(":email", email);.bindValue(":log", login);.bindValue(":pas", pas);.bindValue(":id_v", id_vracha);.exec();

}();;

}2:{(int i = 0; i < ui->tableWidget_otdeleniya->rowCount(); i++){id_otdeleniya = ui->tableWidget_otdeleniya->item(i,3)->text().toInt();.prepare("DELETE FROM otdelenie WHERE id_otdeleniya =:id_otd");.bindValue(0, id_otdeleniya);.exec();

}(int i = 0; i < ui->tableWidget_otdeleniya->rowCount(); i++){nazv = ui->tableWidget_otdeleniya->item(i,0)->text();tel = ui->tableWidget_otdeleniya->item(i,1)->text();email = ui->tableWidget_otdeleniya->item(i,2)->text();id_otdel = ui->tableWidget_otdeleniya->item(i,3)->text();.prepare("INSERT INTO otdelenie (id_otdeleniya, name, telefon, email) VALUES (:id_otd,:name,:tel,:email)");.bindValue(0,id_otdel);.bindValue(1, nazv);.bindValue(2, tel);.bindValue(3,email);.exec();

}();;

}3:{(int i = 0; i < ui->tableWidget_palaty->rowCount(); i++){id_palaty = ui->tableWidget_palaty->item(i,2)->text().toInt();.prepare("DELETE FROM palata WHERE id_palaty =:id_p");.bindValue(0, id_palaty);.exec();

}(int i = 0; i< ui->tableWidget_palaty->rowCount(); i++){no_pal = ui->tableWidget_palaty->item(i,0)->text();kol_mest = ui->tableWidget_palaty->item(i,1)->text();id_pal = ui->tableWidget_palaty->item(i,2)->text();.prepare("INSERT INTO palata (no_palaty, kol_mest, id_palaty) VALUES (:no_p,:kol_m,:id_p)");.bindValue(0,no_pal);.bindValue(1,kol_mest);.bindValue(2,id_pal);.exec();

}();;

}:;

}

}

//обновить содержимое таблицы карт пациентаMainWindow::on_pushButton_refresh_karta_clicked(){row = ui->tableWidget_patient->selectionModel()->selectedIndexes()[0].row();patient_id = ui->tableWidget_patient->item(row,11)->text().toInt();(patient_id);

}

//смена пользователяMainWindow::on_actionChangeUser_activated(){= new autorization();(autorizationWidget, SIGNAL(authorization_successfull(bool)), this, SLOT(setControlsEnabled(bool)));

autorizationWidget->show();

}

//обновить данные в таблицах главного окна программы

void MainWindow::on_actionRefresh_activated()

{indexPage = ui->tabWidget->currentIndex();(indexPage){0: {();;

}1: {();;

}2: {();;

}3: {();;

}:;

}

}

// выписать пациентаMainWindow::on_pushButton_vypisat_clicked()

{row = ui->tableWidget_karta->selectionModel()->selectedIndexes()[0].row();id_karty = ui->tableWidget_karta->item(row, 4)->text().toInt();path = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("Отчет о результатах лечения выписываемого пациента"), "C:\\");dateNow = QDate().currentDate().toString("dd.MM.yyyy");timeNow = QTime().currentTime().toString("HH:mm");query;.prepare("INSERT INTO vypisannye_pacienty (id_karty, data, vremya, otchet)"

"VALUES (:id_k,:date,:time,:otchet)");.bindValue(0, id_karty);.bindValue(1,dateNow);.bindValue(2,timeNow);.bindValue(3,path);

query.exec();

}

//открыть файл-отчет для данного выписанного пациента

void MainWindow::on_pushButton_infoVypisannogo_clicked()

{row = ui->tableWidget_karta->selectionModel()->selectedIndexes()[0].row();id_karty = ui->tableWidget_karta->item(row, 4)->text();query;.prepare("SELECT otchet FROM vypisannye_pacienty WHERE id_karty =:id_k");.bindValue(0, id_karty);.exec();(query.next()){filePath = query.value(0).toString();::execute("winword "+filePath);

}

}MainWindow::on_action_search_triggered(){indexPage = ui->tabWidget->currentIndex();(indexPage){0: {();;

}1: {();;

}2: {();;

}3: {();;

}:;

}

}

//отображение наблюденийMainWindow::on_tableWidget_karta_itemDoubleClicked(QTableWidgetItem* item)

{row = ui->tableWidget_karta->selectionModel()->selectedIndexes()[0].row();id_k = ui->tableWidget_karta->item(row,4)->text().toInt();(id_k!= 0){*supervision = new Supervision();>id_karty = id_k;query;.prepare("SELECT data,vremya,lekarstvo,dozirovka,procedura,analiz,rezultat,id_nabludeniya, id_karty FROM nabludenie WHERE id_karty =:id_k ");.bindValue(0,id_k);.exec();(query.next()){rows = supervision->ui->tableWidget->rowCount();>ui->tableWidget->insertRow(rows);>ui->tableWidget->setItem(rows, 0, new QTableWidgetItem(query.value(0).toString()));>ui->tableWidget->setItem(rows, 1, new QTableWidgetItem(query.value(1).toString()));>ui->tableWidget->setItem(rows, 2, new QTableWidgetItem(query.value(2).toString()));>ui->tableWidget->setItem(rows, 3, new QTableWidgetItem(query.value(3).toString()));>ui->tableWidget->setItem(rows, 4, new QTableWidgetItem(query.value(4).toString()));>ui->tableWidget->setItem(rows, 5, new QTableWidgetItem(query.value(5).toString()));>ui->tableWidget->setItem(rows, 6, new QTableWidgetItem(query.value(6).toString()));>ui->tableWidget->setItem(rows, 7, new QTableWidgetItem(query.value(7).toString()));>ui->tableWidget->setItem(rows, 8, new QTableWidgetItem(query.value(8).toString()));

}

// прописывает заголовок окна наблюденийdate_karty;

query.prepare ("SELECT data_sozd FROM karta WHERE id_karty =:id_k");.bindValue(0, id_k);.exec();(query.next())_karty = query.value(0).toString();.prepare("SELECT familiya, imya, otchestvo FROM pacient WHERE id_pacienta ="

"(SELECT id_pacienta FROM karta WHERE id_karty =:id_k)");.bindValue(0, id_k);.exec();(query.next()){

// const QString title = query.value(0).toString()+" "+ query.value(1).toString()+" "+query.value(2).toString()+", "+ date_karty;>setWindowTitle(query.value(0).toString()+" "+ query.value(1).toString()+" "+query.value(2).toString()+", "+ date_karty);

}(ui->pushButton_add_karta->isEnabled()){>ui->buttonAdd->setEnabled(true);>ui->buttonDelete->setEnabled(true);>ui->buttonApply->setEnabled(true);>ui->buttonRefresh->setEnabled(true);

}>show();

}

}

.h

#ifndef SUPERVISION_H

#define SUPERVISION_H

#include <QWidget>Ui {Supervision;

}Supervision: public QWidget

{_OBJECT:(QWidget *parent = 0);::Supervision *ui;id_karty;refresh();

~Supervision();:

// Ui::Supervision *ui;slots:on_buttonRefresh_clicked();on_buttonApply_clicked();on_buttonDelete_clicked();on_buttonAdd_clicked();:

};

#endif // SUPERVISION_H

.cpp

#include <QTableWidget>

#include <QDate>

#include <QTime>

#include <QFileDialog>

#include "supervision.h"

#include "ui_supervision.h"

#include <connection.h>::Supervision(QWidget *parent): QWidget(parent),ui(new Ui::Supervision){>setupUi(this);>tableWidget->setSelectionMode(QAbstractItemView::MultiSelection);>tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);>tableWidget->hideColumn(7);>tableWidget->hideColumn(8);

}::~Supervision(){ui;

}Supervision::refresh(){(int i = ui->tableWidget->rowCount()-1; i >= 0; i--){>tableWidget->removeRow(i);

}query;.prepare("SELECT data, vremya, lekarstvo, dozirovka, procedura, analiz, rezultat, id_nabludeniya, id_karty FROM nabludenie WHERE id_karty ==:id_k ");.bindValue(0, id_karty);.exec();(query.next()){rows = ui->tableWidget->rowCount();>tableWidget->insertRow(rows);>tableWidget->setItem(rows, 0, new QTableWidgetItem(query.value(0).toString()));>tableWidget->setItem(rows, 1, new QTableWidgetItem(query.value(1).toString()));>tableWidget->setItem(rows, 2, new QTableWidgetItem(query.value(2).toString()));>tableWidget->setItem(rows, 3, new QTableWidgetItem(query.value(3).toString()));>tableWidget->setItem(rows, 4, new QTableWidgetItem(query.value(4).toString()));>tableWidget->setItem(rows, 5, new QTableWidgetItem(query.value(5).toString()));>tableWidget->setItem(rows, 6, new QTableWidgetItem(query.value(6).toString()));>tableWidget->setItem(rows, 7, new QTableWidgetItem(query.value(7).toString()));>tableWidget->setItem(rows, 8, new QTableWidgetItem(query.value(8).toString()));

}

}

//добавить строкуSupervision::on_buttonAdd_clicked()

{rows = ui->tableWidget->rowCount();>tableWidget->insertRow(rows);(int i = 0; i < ui->tableWidget->columnCount(); i++)>tableWidget->setItem(rows, i, new QTableWidgetItem());date = QDate().currentDate();>tableWidget->item(rows, 0)->setText(date.toString("dd.MM.yyyy"));time = QTime().currentTime();>tableWidget->item(rows,1)->setText(time.toString("HH.mm"));

}

//удалить строкуSupervision::on_buttonDelete_clicked()

{(!ui->tableWidget->selectionModel()->selectedIndexes().isEmpty()){rows = ui->tableWidget->rowCount();(int i = rows - 1; i >= 0; i--){(ui->tableWidget->item(i, 0)->isSelected()){id_sv = ui->tableWidget->item(i, 7)->text().toInt();query;.prepare("DELETE FROM nabludenie WHERE id_nabludeniya =:id_sv");.bindValue("id_sv", id_sv);.exec();>tableWidget->removeRow(i);

}

}

}

}

//сохранить измененияSupervision::on_buttonApply_clicked()

{query;.prepare("DELETE FROM nabludenie WHERE id_karty =:id");.bindValue(0,id_karty);.exec();rows = ui->tableWidget->rowCount();(int i = 0; i < rows; i++){date = ui->tableWidget->item(i,0)->text();time = ui->tableWidget->item(i,1)->text();lek = ui->tableWidget->item(i,2)->text();doz = ui->tableWidget->item(i,3)->text();proc = ui->tableWidget->item(i,4)->text();analiz = ui->tableWidget->item(i,5)->text();result = ui->tableWidget->item(i,6)->text();id_sv = ui->tableWidget->item(i,7)->text();.prepare("INSERT INTO nabludenie (id_karty, data, vremya, lekarstvo, dozirovka, procedura, analiz, rezultat, id_nabludeniya) VALUES (:id_k,:date,:time,:lek,:doz,:proc,:an,:res,:id_sv)");.bindValue(0,id_karty);.bindValue(1,date);.bindValue(2,time);.bindValue(3,lek);.bindValue(4,doz);.bindValue(5,proc);.bindValue(6,analiz);.bindValue(7,result);.bindValue(8,id_sv);.exec();

}();

}

//void Supervision::putPath(){

// QString = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("Прикрепить документ к наблюдению"), "C:\\");

// ui->tableWidget->item()

//}Supervision::on_buttonRefresh_clicked()

{();

}

.h

#ifndef AUTORIZATION_H

#define AUTORIZATION_H

#include <QWidget>

//#include "mainwindow.h"

//#include "connection.h"Ui {autorization;

}autorization: public QWidget {_OBJECT:(QWidget *parent = 0);::autorization *ui;

~autorization();:authorization_successfull(bool);:

// Ui::autorization *ui;slots:on_pushButton_Out_clicked();on_pushButton_Enter_clicked();

};

#endif // AUTORIZATION_H

.cpp

#include <QSqlQuery>

#include <QMessageBox>

#include "autorization.h"

#include "ui_autorization.h"::autorization(QWidget *parent): QWidget(parent), ui(new Ui::autorization){>setupUi(this);

}::~autorization()

{ui;

}autorization::on_pushButton_Enter_clicked(){login = ui->lineEdit_Login->text();password = ui->lineEdit_Password->text();query;.prepare("SELECT id_vracha FROM vrach WHERE login =:log AND parol =:pasw");.bindValue(0,login);.bindValue(1,password);.exec();(query.next()){::information(this,"",QString::fromLocal8Bit("Здравствуйте, ")+login+"!");authorization_successfull(true);();

}QMessageBox::information(this,"",QString::fromLocal8Bit("Неверное имя пользователя или пароль."));

}autorization::on_pushButton_Out_clicked(){();

}

.h

#ifndef ITEMDELEGATE_H

#define ITEMDELEGATE_H

#include <QItemDelegate>ItemDelegate: public QItemDelegate{_OBJECT:(QObject *parent = 0);*createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;void setEditorData(QWidget *editor, const QModelIndex &index) const;setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;:slots:

};forOtdelenieDelegate: public ItemDelegate{_OBJECT:void setEditorData(QWidget *editor, const QModelIndex &index) const;:slots:

};forVrachDelegate: public ItemDelegate{_OBJECT:void setEditorData(QWidget *editor, const QModelIndex &index) const;:slots:

};forPalatyDelegate: public ItemDelegate{_OBJECT:void setEditorData(QWidget *editor, const QModelIndex &index) const;:slots:

};forStatusDelegate: public ItemDelegate{_OBJECT:void setEditorData(QWidget *editor, const QModelIndex &index) const;:slots:

};

#endif // ITEMDELEGATE_H

.cpp

#include <QComboBox>

#include <QSqlQuery>

#include "itemdelegate.h"::ItemDelegate(QObject *parent): QItemDelegate(parent){}* ItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{*editor = new QComboBox(parent);>setEditable(true);editor;

}ItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{*comboBox = static_cast<QComboBox*>(editor);>setData(index, comboBox->itemText(comboBox->currentIndex()));

}ItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{*comboBox = static_cast<QComboBox*>(editor);>addItem(QString::fromLocal8Bit("муж"));>addItem(QString::fromLocal8Bit("жен"));

}ItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const{>setGeometry(option.rect);

}forOtdelenieDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{*comboBox = static_cast<QComboBox*>(editor);query;.exec("SELECT DISTINCT name FROM otdelenie WHERE id_otdeleniya!=0 ");(query.next()){>addItem(query.value(0).toString());

}

}forVrachDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{*comboBox = static_cast<QComboBox*>(editor);query;.exec("SELECT DISTINCT familiya FROM vrach WHERE id_vracha!= 0 ");(query.next()){>addItem(query.value(0).toString());

}

}forPalatyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{*comboBox = static_cast<QComboBox*>(editor);query;.exec("SELECT DISTINCT no_palaty FROM palata WHERE id_palaty!= 0 ");(query.next()){>addItem(query.value(0).toString());

}

}forStatusDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{*comboBox = static_cast<QComboBox*>(editor);>addItem(QString::fromLocal8Bit("амбулаторно"));>addItem(QString::fromLocal8Bit("стационарно"));

}

Похожие работы на - Автоматизация учета пациентов больницы

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!