ООП Синенко_361_зо
.docx
Задание страховая компания
Описание предметной области
Вы работаете в страховой компании. Вашей задачей является отслеживание финансовой деятельности компании.
Компания имеет различные филиалы по всей стране. Каждый филиал характеризуется названием, адресом и телефоном.
Деятельность компании организована следующим образом: к Вам обращаются различные лица с целью заключения договора о страховании. В зависимости от принимаемых на страхование объектов и страхуемых рисков, договор заключается по определенному виду страхования (например, страхование автотранспорта от угона, страхование домашнего имущества, добровольное медицинское страхование). При заключении договора Вы фиксируете дату заключения, страховую сумму, вид страхования, тарифную ставку и филиал, в котором заключался договор.
Классы объектов
Договоры (Номер договора, Дата заключения, Страховая сумма, Тарифная ставка, Филиал, Вид страхования).
Вид страхования (Вид страхования, Наименование).
Филиал (Филиал, Наименование филиала, Адрес, Телефон).
Задание 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.