Пример #1
0
class MainWindow(QWidget, MainWindow_UI.Ui_Form):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.function = Function()
        self.endDateEdt.setDate(QDate.currentDate())
        self.initSlots()
        self.chargeTable.setHorizontalHeaderLabels(
            ['id', '成员', '类型', '金额(元)', '日期', '备注'])
        self.memberTable.setHorizontalHeaderLabels(['id', '姓名', '备注'])
        self.memberTable.setColumnHidden(0, True)
        self.chargeTable.setColumnHidden(0, True)
        self.updateMemberUI()
        self.updateTypeUI()
        self.updateChargeTable()

    def initSlots(self):
        self.filtrateBtn.clicked.connect(self.updateChargeTable)
        self.revertBtn.clicked.connect(self.revertCondition)
        # TypeOperation
        self.delTypeBtn.clicked.connect(self.delType)
        self.addTypeBtn.clicked.connect(self.addType)
        # Member
        self.addMbrBtn.clicked.connect(self.addMbr)
        self.delMbrBtn.clicked.connect(self.delMbr)
        self.memberTable.itemChanged.connect(self.modifyMbr)
        # Charge
        self.chargeTable.itemDoubleClicked.connect(self.storeCurrentValue)
        self.chargeTable.itemChanged.connect(self.modifyCharge)
        self.chargeBtn.clicked.connect(self.addCharge)
        self.delChargeBtn.clicked.connect(self.delCharge)
        self.searchEdit.textChanged.connect(self.searchContent)

    def updateChargeTable(self):
        self.chargeTable.itemChanged.disconnect(self.modifyCharge)
        self.chargeTable.setSortingEnabled(False)
        endDate = self.endDateEdt.date().toString('yyyy-MM-dd')
        startDate = self.startDateEdt.date().toString('yyyy-MM-dd')
        member = self.mbrCBox.currentText()
        type = self.typeCBox.currentText()
        charges = self.function.getChargeList(startDate, endDate, member, type)
        rowCount = 0
        for charge in charges:
            rowCount += 1
        self.chargeTable.setRowCount(rowCount)
        rowCount = 0
        for charge in charges:
            id = QTableWidgetItem(str(charge.id))
            type = QTableWidgetItem(charge.type_id)
            amount = QTableWidgetItem(str(charge.amount))
            member = QTableWidgetItem(charge.username_id)
            info = QTableWidgetItem(charge.info)
            date = QTableWidgetItem(charge.date)

            id.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            type.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            amount.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            member.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            info.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            date.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

            self.chargeTable.setItem(rowCount, 0, id)
            self.chargeTable.setItem(rowCount, 1, member)
            self.chargeTable.setItem(rowCount, 2, type)
            self.chargeTable.setItem(rowCount, 3, amount)
            self.chargeTable.setItem(rowCount, 4, date)
            self.chargeTable.setItem(rowCount, 5, info)
            rowCount += 1
        self.chargeTable.setSortingEnabled(True)
        self.chargeTable.itemChanged.connect(self.modifyCharge)
        self.searchContent()

    def updateMemberUI(self):
        # 这一句是为了防止更新UI的时候出发itemChange信号
        self.memberTable.itemChanged.disconnect(self.modifyMbr)
        members = self.function.getMbrList()
        self.mbrCBox.clear()
        self.mbrCBox.addItem(SymbolAll)
        for member in members:
            self.mbrCBox.addItem(member.name)
        # todo 调整cbox的大小
        i = 0
        for member in members:
            i += 1
        self.memberTable.setRowCount(i)
        i = 0
        for member in members:
            id = QTableWidgetItem(str(member.id))
            name = QTableWidgetItem(member.name)
            info = QTableWidgetItem(member.info)
            name.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
            info.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
            self.memberTable.setItem(i, 0, id)
            self.memberTable.setItem(i, 1, name)
            self.memberTable.setItem(i, 2, info)
            i += 1
        self.memberTable.resizeColumnToContents(1)
        # 重新连接信号和槽函数
        self.memberTable.itemChanged.connect(self.modifyMbr)

    def updateTypeUI(self):
        self.typeList.clear()
        types = self.function.getTypeList()
        self.typeCBox.clear()
        self.typeCBox.addItem(SymbolAll)
        for type in types:
            self.typeCBox.addItem(type.type)
            self.typeList.addItem(type.type)
        # todo 调整cbox的大小

    # 类型操作
    def delType(self):
        if self.typeList.currentRow() == -1:
            return
        reply = QMessageBox.question(self, '确认', '删除类型的同时会删除所有该类型的账单,是否继续?',
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.Yes)
        if reply == QMessageBox.No:
            return
        self.function.delType(self.typeList.currentItem().text())
        self.updateTypeUI()
        self.updateChargeTable()

    def addType(self):
        text, ok = QInputDialog.getText(self, "添加类型", "输入类型")
        if ok:
            self.function.addType(text)
        self.updateTypeUI()

    # 成员操作
    def addMbr(self):
        dialog = addMbrWindow(self)
        result = dialog.exec()
        if result:
            self.function.addMbr(*dialog.getResult())
            self.updateMemberUI()

    def modifyMbr(self, item):
        if item.column() == 1:
            QMessageBox.warning(self, '警告', '不允许更改用户名!', QMessageBox.Ok,
                                QMessageBox.Ok)
            self.updateMemberUI()
            return
        id = int(self.memberTable.item(item.row(), 0).text())
        name = self.memberTable.item(item.row(), 1).text()
        info = self.memberTable.item(item.row(), 2).text()
        self.function.modifyMbr(id, name, info)
        self.updateMemberUI()

    def delMbr(self):
        reply = QMessageBox.question(self, '确认', '删除成员的同时会删除所有该成员的账单,是否继续?',
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.Yes)
        if reply == QMessageBox.No:
            return
        id = int(
            self.memberTable.item(self.memberTable.currentRow(), 0).text())
        self.function.delMbr(id)
        self.updateMemberUI()
        self.updateChargeTable()

    def revertCondition(self):
        self.mbrCBox.setCurrentIndex(0)
        self.typeCBox.setCurrentIndex(0)
        self.startDateEdt.setDate(QDate.fromString('2000-01-01', 'yyyy-MM-dd'))
        self.endDateEdt.setDate(QDate.currentDate())
        self.updateChargeTable()

    def storeCurrentValue(self, item):
        self.preValue = item.text()

    # 账单操作
    def addCharge(self):
        dialog = addChargeDialog(self.function.members, self.function.types,
                                 self)
        ok = dialog.exec()
        if ok:
            self.function.addCharge(*dialog.getResult())
            print(dialog.getResult())
            self.updateChargeTable()

    def delCharge(self):
        id = int(
            self.chargeTable.item(self.chargeTable.currentRow(), 0).text())
        self.function.delCharge(id)
        self.updateChargeTable()

    def modifyCharge(self, item):
        id = int(self.chargeTable.item(item.row(), 0).text())
        member = self.chargeTable.item(item.row(), 1).text()
        type = self.chargeTable.item(item.row(), 2).text()

        try:
            amount = float(self.chargeTable.item(item.row(), 3).text())
        except:
            item.setText(self.preValue)
            QMessageBox.warning(self, '提示', '您输入的数据有误,请确认后再修改',
                                QMessageBox.Yes, QMessageBox.Yes)
            item.setSelected(True)
            return
        date = self.chargeTable.item(item.row(), 4).text()
        info = self.chargeTable.item(item.row(), 5).text()
        if self.checkMbr(member) and self.checkType(type) and self.checkDate(
                date):
            self.function.modifyCharge(id, member, type, amount, date, info)
        else:
            item.setText(self.preValue)
            QMessageBox.warning(self, '提示', '您输入的数据有误,请确认后再修改',
                                QMessageBox.Yes, QMessageBox.Yes)
            item.setSelected(True)

    def checkMbr(self, string):
        # 下面的代码段要求任何对数据库的members表进行改动的操作必须要重新调用getMbrList()来更新funciton.member,也就是说要重新调用updateMbrUI()
        if string is None:
            return False
        for member in self.function.members:
            if member.name == string:
                return True
        return False

    def checkType(self, string):
        if string is None:
            return False
        # 下面的代码段要求任何对数据库的types表进行改动的操作必须要重新调用getTypeList()来更新funciton.type,也就是说要重新调用updateTypeUI()
        for type in self.function.types:
            if type.type == string:
                return True
        return False

    def checkDate(self, string):
        if string is None:
            return False
        if re.match(r'^[0-9]{4}\-[0-9]{1,2}\-[0-9]{1,2}$', string) is None:
            return False
        if QDate.isValid(*tuple(map(int, string.split('-')))):
            return True
        return False

    def searchContent(self):
        string = self.searchEdit.text()
        for row in range(self.chargeTable.rowCount()):
            if self.chargeTable.item(row, 5).text().find(string) == -1:
                self.chargeTable.setRowHidden(row, True)
            else:
                self.chargeTable.setRowHidden(row, False)