Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП Синенко_361_зо

.docx
Скачиваний:
4
Добавлен:
01.01.2023
Размер:
224.86 Кб
Скачать

Задание страховая компания

Описание предметной области

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

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

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

Классы объектов

Договоры (Номер договора, Дата заключения, Страховая сумма, Тарифная ставка, Филиал, Вид страхования).

Вид страхования (Вид страхования, Наименование).

Филиал (Филиал, Наименование филиала, Адрес, Телефон).

Задание 4

С использованием библиотеки для программирования графического интерфейса QT сделать форму для вывода данных, в табличной форме, хранящихся в формате XML и в базе данных SQLite, с использованием функций из заданий 2 и 3.

Решение:

Сделаем форму, как на рисунке 1.

Рисунок 1 – Форма «Страховая компания»

Опишем виджеты для отображения данных. Все они должны иметь возможность устанавливать соответствие между строками данных и кодами записей, отображаемых в них. Для этого опишем класс «rowCode» в модуле «rowcode.py» Список упорядоченных пар (tuple) «list», хранит соответствия между номерами строк таблицы и кодами отображаемых в них записей.

Рисунок 2 - rowcode.py

Определим классы для отображения данных в табличной форме. Для каждой сущности определим отдельный класс.У всех этих классов есть общие атрибуты и методы, которые опишем в общем классе предке «dbTableWidget» в модуле

«branchtable.py».

Рисунок 3 - branchtable.py

Определим функцию «update», которая заполняет таблицу данными из объекта «library». Количество необходимых строк получим вычислив длину

(функцией «len») списка кодов книг, который можно подучить функцией «getBookCodes» класса «library», определенной при выполнении задания 2.

Заполнение ячеек таблицы происходит с помощью метода «setItem» класса «QTableWidget», который принимает на вход номер строки, номер столбца и ссылку на объект класса «QTableWidgetItem». В нашем случае, при создании объекта класса «QTableWidgetItem» его конструктор принимает на вход текстовую строку, которую необходимо отобразить в ячейке таблицы.

Рисунок 4 - contractstable.py

Чтобы увидеть внешний вид описанной таблицы, напишем тестовую программу в модуле «test.py», которую можно использовать для тестирования остальных виджетов.

Рисунок 4 - test.py

Опишем класс InsuranceCompany в модуле insurancecompany.ру.

from branchlist import BranchList

from insurancelist import InsuranceList

from contractlist import ContractList

class InsuranceCompany:

def __init__(self):

self.__branchList = BranchList()

self.__insuranceList = InsuranceList()

self.__contractList = ContractList()

def clear(self):

self.__branchList.clear()

self.__insuranceList.clear()

self.__contractList.clear()

def createInsurance(self, code, name):

self.__insuranceList.createItem(code, name)

def newInsurance(self, name): self.__insuranceList.newItem(name)

def removeInsurance(self, value):

self.__insuranceList.remove(value)

def getInsurance(self, code): return self.__insuranceList.find(code)

def getInsuranceList(self): return self.__insuranceList.getItems()

def getInsuranceCodes(self): return self.__insuranceList.getCodes()

def createBranch(self, code, name, address='', phone=''):

self.__branchList.createItem(code, name, address, phone)

def newBranch(self, name, address='', phone=''):

self.__branchList.newItem(name, address, phone)

def removeBranch(self, value):

self.__branchList.remove(value)

def getBranch(self, code): return self.__branchList.find(code)

def getBranchList(self): return self.__branchList.getItems()

def getBranchCodes(self): return self.__branchList.getCodes()

def createContract(self, code, num, date, risk, rate, branch, insurance):

self.__contractList.createItem(code, num, date, risk, rate,

branch, insurance)

def newContract(self, num, date, risk, rate, branch, insurance):

self.__contractList.newItem(num, date, risk, rate, branch, insurance)

def removeContract(self, value):

self.__contractList.remove(value)

def getContract(self, code): return self.__contractList.find(code)

def getContractList(self): return self.__contractList.getItems()

def getContractCodes(self): return self.__contractList.getCodes()

Создадим классы, реализующие формы для редактирования записей. Опишем класс, который будет общим предком форм для редактирования «editForm» в модуле «editform.py»

from PyQt5.QtWidgets import QWidget,QGridLayout,QVBoxLayout,QHBoxLayout,QPushButton,QLabel

from insWidget import insWidge

class editForm(QWidget,insWidget):

def __init__(self,tablewidget=None,parent=None,insurance=None):

QWidget.__init__(self,parent=parent)

insWidget.__init__(self,insurance)

self.__tablewidget=tablewidget

self.__mainvbox=QVBoxLayout()

self.__mainvbox.addWidget(self.__tablewidget)

self.__grid=QGridLayout()

self.__vbox=QVBoxLayout()

self.__hbox=QHBoxLayout()

self.__vbox.addLayout(self.__grid)

self.__vbox.addStretch(1)

self.__hbox.addLayout(self.__vbox)

self.__buttonsVBox=QVBoxLayout()

self.__hbox.addLayout(self.__buttonsVBox)

self.__newButton=QPushButton(u"Добавить")

self.__editButton=QPushButton(u"Изменить")

self.__delButton=QPushButton(u"Удалить")

self.__buttonsVBox.addWidget(self.__newButton)

self.__buttonsVBox.addWidget(self.__editButton)

self.__buttonsVBox.addWidget(self.__delButton)

self.__buttonsVBox.addStretch(1)

self.__mainvbox.addLayout(self.__hbox)

self.setLayout(self.__mainvbox)

self.__newButton.clicked.connect(self.newClick)

self.__editButton.clicked.connect(self.editClick)

self.__delButton.clicked.connect(self.delClick)

self.__tablewidget.currentCellChanged.connect(self.tableClick

def getGreed(self):return self.__grid

def addLabel(self,text,x,y):self.__grid.addWidget(QLabel(text),x,y)

def addNewWidget(self,widget,x,y):self.__grid.addWidget(widget,x,y)

def addLeftLayout(self,layout):self.__hbox.insertLayout(0,layout)

def setCurrentCode(self):

self.__currentCode=self.__tablewidget.getCurrentCode()

self.update()

def getCurrentCode(self):return self.__currentCode

def decode(self,qstring):return str(qstring.toUtf8()).decode('utf-8')

def newClick(self):pass

def editClick(self):pass

def delClick(self):pass

def update(self):pass

def tableClick(self):self.setCurrentCode()

def tableUpdate(self):self.__tablewidget.update()

В модуле «dblistwidget.py» опишем класс «dbListWidget».

from PyQt5.QtWidgets import QListWidget

from rowcode import rowCode

from insWidget import insWidget

class dbListWidget(QListWidget,insWidget):

def __init__(self,parent=None,insurance=None):

QListWidget.__init__(self,parent)

insWidget.__init__(self,insurance)

self.__rowCode=rowCode()

def clear(self):

self.__rowCode.clear()

QListWidget.clear(self)

def addItem(self,code,text):

self.__rowCode.appendRowCode(self.count(),code)

QListWidget.addItem(self,text)

def removeSelected(self):

self.__rowCode.removeRow(self.currentRow())

for item in self.selectedItems():

self.takeItem(self.row(item))

def getCurrentCode(self):return self.__rowCode.getCode(self.currentRow())

def setCurrentRec(self,value):

self.__currentRec=value

self.update()

def getCurrentRec(self):return self.__currentRec

def getCodes(self):return self.__rowCode.getCodes()

def update(self):pass

В модуле «dbcombobox.py» опишем класс «dbComboBox»

from PyQt5.QtWidgets import QComboBox

from rowcode import rowCode

from insWidget import insWidget

class dbComboBox(QComboBox,insWidget):

def __init__(self,parent=None,insurance=None):

QComboBox.__init__(self,parent)

insWidget.__init__(self,insurance)

self.__rowCode=rowCode()

self.setSizeAdjustPolicy(self.AdjustToContents)

def clear(self):

self.__rowCode.clear()

QComboBox.clear(self)

def addItem(self,code,text):

self.__rowCode.appendRowCode(self.count(),code)

QComboBox.addItem(self,text)

def removeItem(self,index):

self.__rowCode.removeRow(index)

QComboBox.removeItem(self,index)

def getCurrentCode(self):return self.__rowCode.getCode(self.currentIndex())

def setCurrentCode(self,code):

if self.__rowCode.getRow(code):

self.setCurrentIndex(self.__rowCode.getRow(code))

def setCurrentRec(self,value):

self.__currentRec=value

self.update()

def getCurrentRec(self):return self.__currentRec

def update(self):pass

Реализуем главное окно программы с возможностью создания новой базы данных, загрузки, сохранения в форматах XML и sqlite3, в модуле «main4.py»

from PyQt5.QtWidgets import QApplication,QMainWindow,QAction,QFileDialog

from PyQt5.QtGui import QIcon

import sys,os

sys.path.insert(0, "./insurance")

from datasql import DataSql

from dataxml import DataXml

from datajson import DataJson

from insurancecompany import InsuranceCompany

from tab import tabWidget

app = QApplication(sys.argv)

class mainWindow(QMainWindow):

def __init__(self):

QMainWindow.__init__(self)

self.setWindowTitle(u'Библиотека')

self.setGeometry(100, 100, 800, 400)

self.insurance=InsuranceCompany()

self.dataxml=DataXml(self.insurance)

self.datasql=DataSql(self.insurance)

self.datajson=DataJson(self.insurance)

self.tabWidget=tabWidget(self.insurance,self)

self.setCentralWidget(self.tabWidget)

self.tabWidget.update()

self.new=QAction(QIcon(),'New',self)

self.new.setStatusTip('New database')

self.new.triggered.connect(self.newAction)

self.openxml=QAction(QIcon(),'Open XML',self)

self.openxml.setStatusTip('Open data from XML')

self.openxml.triggered.connect(self.openXMLAction)

self.opensql=QAction(QIcon(),'Open SQL',self)

self.opensql.setStatusTip('Open data from SQL')

self.opensql.triggered.connect(self.openSQLAction)

self.savexml=QAction(QIcon(),'Save XML',self)

self.savexml.setStatusTip('Save data to XML')

self.savexml.triggered.connect(self.saveXMLAction)

self.savesql=QAction(QIcon(),'Save SQL',self)

self.savesql.setStatusTip('Save data to SQL')

self.savesql.triggered.connect(self.saveSQLAction)

self.menubar=self.menuBar()

self.menufile=self.menubar.addMenu('&File')

self.menufile.addAction(self.new)

self.menufile.addSeparator()

self.menufile.addAction(self.openxml)

self.menufile.addAction(self.opensql)

self.menufile.addSeparator()

self.menufile.addAction(self.savexml)

self.menufile.addAction(self.savesql)

self.statusBar()

def newAction(self):

self.insurance.clear()

self.tabWidget.update()

def openXMLAction(self):

filename=QFileDialog.getOpenFileName(self,u'Открыть XML',os.getcwd(),u"*.xml")[0]

if filename:

self.insurance.clear()

self.dataxml.readFile(filename)

self.tabWidget.update()

def openSQLAction(self):

filename=QFileDialog.getOpenFileName(self,u'Открыть SQL',os.getcwd(),u"*.sqlite")[0]

if filename:

self.insurance.clear()

self.datasql.readFile(filename)

self.tabWidget.update()

def saveXMLAction(self):

filename=QFileDialog.getSaveFileName(self,u'Сохранить XML',os.getcwd(),u"*.xml")[0]

if filename:self.dataxml.writeFile(filename)

def saveSQLAction(self):

filename=QFileDialog.getSaveFileName(self,u'Сохранить SQL',os.getcwd(),u"*.sqlite")[0]

if filename:self.datasql.writeFile(filename)

mw=mainWindow()

mw.show()

sys.exit(app.exec_())

В результате выполнения программы из модуля «main4.py» получим окно вид которого приведен на рисунке 1.