コード例 #1
0
ファイル: getRooms.py プロジェクト: niknefed/hostel_swsu
class Lodgers(QtWidgets.QMainWindow, Ui_lodgers):
    def __init__(self, parent=None):
        super(Lodgers, self).__init__(parent)
        self.setupUi(self)

        sdb = QSqlDatabase.addDatabase('QSQLITE')
        sdb.setDatabaseName('baza.db')
        sdb.open()
        self.model = QSqlTableModel(db=sdb)
        self.model.setTable("users")
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.select()

        self.tableView_1.setModel(self.model)

        self.rоом_beds = []

        self.pushButton_9.clicked.connect(
            self.on_add_record)  # Добавить запись
        self.pushButton_10.clicked.connect(
            self.on_del_record)  # Удалить запись

    def on_add_record(self):
        row = self.tableView_1.selectionModel().currentIndex().row()
        if self.tableView_1.selectionModel().currentIndex().row() == -1:
            row = 0
            self.model.insertRow(row)
        else:
            row = row + 1
            self.model.insertRow(row)

        self.model.setData(self.model.index(row, 0), 'ФИО NEW')
        self.model.setData(self.model.index(row, 1), '0000')
        self.model.setData(self.model.index(row, 2), '0')
        self.model.setData(self.model.index(row, 3), '0')
        self.model.submit()

    def on_del_record(self):
        self.model.removeRow(self.tableView_1.currentIndex().row())
        self.model.select()

    def _getRooms(self):
        self.rоом_beds = []
        for row in range(self.model.rowCount()):
            if self.model.data(self.model.index(row, 2)) == 1:
                rоом_bed = str(self.model.data(
                    self.model.index(row, 1)))[:3], \
                           str(self.model.data(self.model.index(row, 1)))[3]
                self.rоом_beds.append(rоом_bed)
コード例 #2
0
    def sql_exec(self):
        model = QSqlTableModel()
        model.setTable('students')
        model.setEditStrategy(QSqlTableModel.OnFieldChange)
        model.setHeaderData(0, Qt.Horizontal, 'ID')
        model.setHeaderData(1, Qt.Horizontal, 'Class')
        model.setHeaderData(2, Qt.Horizontal, 'Name')
        model.setHeaderData(3, Qt.Horizontal, 'Score')
        model.select()

        model.insertRow(0)  # 1
        model.setData(model.index(0, 0), 201801010111)
        model.setData(model.index(0, 1), '0101')
        model.setData(model.index(0, 2), 'Who Cares')
        model.setData(model.index(0, 3), 0.5)
        model.submit()

        self.setModel(model)
コード例 #3
0
class SqlModel(object):
    def __init__(self,databasetype="QSQLITE",databasename="data.db",sqltablename="里程碑"):
        db=QSqlDatabase.addDatabase(databasetype)
        db.setDatabaseName(databasename)
        self.sqltablename=sqltablename
        self.__tablemodel()
    def __tablemodel(self):
        self.model=QSqlTableModel()
        self.model.setTable(self.sqltablename)
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.select()
    def modelview(self):
        self.view=QTableView()
        self.view.setModel(self.model)
        # modelwidget=QTabWidget()
        # modelwidget.addTab(self.view, viewname)
        return self.view
    def tabadd(self):
        row = self.model.rowCount()
        self.model.insertRow(row)
        index = self.model.index(row)
        self.view.setCurrentIndex(index)
        self.view.edit(index)
    def tabdel(self):
        index = self.modelview().currentIndex()
        print(index)
        # self.model.removeRow(index.row())
    def tabupdate(self):

        self.model.updateRowInTable()
    def row(self):
        row=self.model.rowCount()
        return row
    def line(self):
        line=self.model.columnCount()
        return line
    def rowvalue(self):
        rowvalue=self.model.insertRowIntoTable(QSqlRecord="")
    def data(self):
        self.model.data()
    def run(self,WindowTitle= "data"):
        app = QApplication(sys.argv)
        dig=QDialog()
        layout=QHBoxLayout()
        layout.addWidget(self.modelview())
        dig.setLayout(layout)
        dig.setWindowTitle(WindowTitle)
        dig.resize(430,450)
        # dig.hide()
        # time.sleep(10)
        dig.show()
        sys.exit(app.exec_())
コード例 #4
0
ファイル: mainWindowView.py プロジェクト: winsomexiao/PyDemo
class MainWindowView(QMainWindow, Ui_MainWindow):
        def __init__(self,dbPath,tblName,parent=None):
            super(MainWindowView, self).__init__(parent)
            self.setupUi(self)

            self.addBtn.clicked.connect(self.addBtnFunc)
            self.updBtn.clicked.connect(self.updBtnFunc)
            self.delBtn.clicked.connect(self.delBtnFunc)

            self.dbPath="test.db"
            self.curTable="test2"

            ###tableView与model绑定
            self.tableModel=QSqlTableModel(self,QSqlDatabase.addDatabase('QSQLITE'))
            self.tableModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
            self.tableView.setModel(self.tableModel)

            ###self.model数据初始化
            self.tableModel.database().setDatabaseName(self.dbPath)
            self.tableModel.database().open()
            self.tableModel.setTable(self.curTable)
            self.tableModel.select()

        #新增按钮关联的槽函数
        def addBtnFunc(self,event):
            f1=random.randint(1, 99)
            self.tableModel.insertRows(0, 1)
            self.tableModel.setData(self.tableModel.index(0, 0), f1)
            self.tableModel.setData(self.tableModel.index(0, 1), "test")
            self.tableModel.submitAll()

        #修改按钮关联的槽函数
        def updBtnFunc(self,event):
             QMessageBox.information( self, '提醒', "updBtnFunc Call!")


        #删除按钮关联的槽函数
        def delBtnFunc(self,event):
             rs=list(map(lambda x:x.row(),self.tableView.selectedIndexes()))
             if len(rs)==0:
                 QMessageBox.information(self,'提醒','请先选中至少一行,再点击此按钮!')
                 return
             for i in reversed(rs):
                 self.tableModel.removeRows(i,1)
             self.tableModel.submitAll()
コード例 #5
0
class QmyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)  #调用父类构造函数,创建窗体
        self.ui = Ui_MainWindow()  #创建UI对象
        self.ui.setupUi(self)  #构造UI界面

        self.setCentralWidget(self.ui.splitter)

        ##   tableView显示属性设置
        self.ui.tableView.setSelectionBehavior(QAbstractItemView.SelectItems)
        self.ui.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
        self.ui.tableView.setAlternatingRowColors(True)
        self.ui.tableView.verticalHeader().setDefaultSectionSize(22)
        self.ui.tableView.horizontalHeader().setDefaultSectionSize(60)

##  ==============自定义功能函数============

    def __getFieldNames(self):  ##获取所有字段名称
        emptyRec = self.tabModel.record()  #获取空记录,只有字段名
        self.fldNum = {}  #字段名与序号的字典
        for i in range(emptyRec.count()):
            fieldName = emptyRec.fieldName(i)
            self.ui.comboFields.addItem(fieldName)
            self.fldNum.setdefault(fieldName)
            self.fldNum[fieldName] = i
        print(self.fldNum)

    def __openTable(self):  ##打开数据表
        self.tabModel = QSqlTableModel(self, self.DB)  #数据模型
        self.tabModel.setTable("employee")  #设置数据表
        self.tabModel.setEditStrategy(QSqlTableModel.OnManualSubmit
                                      )  #数据保存方式,OnManualSubmit , OnRowChange
        self.tabModel.setSort(self.tabModel.fieldIndex("empNo"),
                              Qt.AscendingOrder)  #排序
        if (self.tabModel.select() == False):  #查询数据失败
            QMessageBox.critical(
                self, "错误信息",
                "打开数据表错误,错误信息\n" + self.tabModel.lastError().text())
            return

        self.__getFieldNames()  #获取字段名和序号

        ##字段显示名
        self.tabModel.setHeaderData(self.fldNum["empNo"], Qt.Horizontal, "工号")
        self.tabModel.setHeaderData(self.fldNum["Name"], Qt.Horizontal, "姓名")
        self.tabModel.setHeaderData(self.fldNum["Gender"], Qt.Horizontal, "性别")
        self.tabModel.setHeaderData(self.fldNum["Birthday"], Qt.Horizontal,
                                    "出生日期")
        self.tabModel.setHeaderData(self.fldNum["Province"], Qt.Horizontal,
                                    "省份")
        self.tabModel.setHeaderData(self.fldNum["Department"], Qt.Horizontal,
                                    "部门")
        self.tabModel.setHeaderData(self.fldNum["Salary"], Qt.Horizontal, "工资")

        self.tabModel.setHeaderData(self.fldNum["Memo"], Qt.Horizontal,
                                    "备注")  #这两个字段不在tableView中显示
        self.tabModel.setHeaderData(self.fldNum["Photo"], Qt.Horizontal, "照片")

        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("empNo"),  Qt.Horizontal, "工号")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Name"),   Qt.Horizontal, "姓名")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Gender"), Qt.Horizontal, "性别")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Birthday"),  Qt.Horizontal, "出生日期")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Province"),  Qt.Horizontal, "省份")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Department"),Qt.Horizontal, "部门")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Salary"), Qt.Horizontal, "工资")
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Memo"),   Qt.Horizontal, "备注")   #这两个字段不在tableView中显示
        ##      self.tabModel.setHeaderData(self.tabModel.fieldIndex("Photo"),  Qt.Horizontal, "照片")

        ##创建界面组件与数据模型的字段之间的数据映射
        self.mapper = QDataWidgetMapper()
        self.mapper.setModel(self.tabModel)  #设置数据模型
        self.mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)

        ##界面组件与tabModel的具体字段之间的联系
        self.mapper.addMapping(self.ui.dbSpinEmpNo, self.fldNum["empNo"])
        self.mapper.addMapping(self.ui.dbEditName, self.fldNum["Name"])
        self.mapper.addMapping(self.ui.dbComboSex, self.fldNum["Gender"])
        self.mapper.addMapping(self.ui.dbEditBirth, self.fldNum["Birthday"])
        self.mapper.addMapping(self.ui.dbComboProvince,
                               self.fldNum["Province"])
        self.mapper.addMapping(self.ui.dbComboDep, self.fldNum["Department"])
        self.mapper.addMapping(self.ui.dbSpinSalary, self.fldNum["Salary"])
        self.mapper.addMapping(self.ui.dbEditMemo, self.fldNum["Memo"])
        self.mapper.toFirst()  #移动到首记录

        self.selModel = QItemSelectionModel(self.tabModel)  #选择模型
        self.selModel.currentChanged.connect(self.do_currentChanged)  #当前项变化时触发
        self.selModel.currentRowChanged.connect(
            self.do_currentRowChanged)  #选择行变化时

        self.ui.tableView.setModel(self.tabModel)  #设置数据模型
        self.ui.tableView.setSelectionModel(self.selModel)  #设置选择模型

        self.ui.tableView.setColumnHidden(self.fldNum["Memo"], True)  #隐藏列
        self.ui.tableView.setColumnHidden(self.fldNum["Photo"], True)  #隐藏列

        ##tableView上为“性别”和“部门”两个字段设置自定义代理组件
        strList = ("男", "女")
        self.__delegateSex = QmyComboBoxDelegate()
        self.__delegateSex.setItems(strList, False)
        self.ui.tableView.setItemDelegateForColumn(
            self.fldNum["Gender"], self.__delegateSex)  #Combbox选择型

        strList = ("销售部", "技术部", "生产部", "行政部")
        self.__delegateDepart = QmyComboBoxDelegate()
        self.__delegateDepart.setItems(strList, True)
        self.ui.tableView.setItemDelegateForColumn(self.fldNum["Department"],
                                                   self.__delegateDepart)

        ##更新actions和界面组件的使能状态
        self.ui.actOpenDB.setEnabled(False)

        self.ui.actRecAppend.setEnabled(True)
        self.ui.actRecInsert.setEnabled(True)
        self.ui.actRecDelete.setEnabled(True)
        self.ui.actScan.setEnabled(True)

        self.ui.groupBoxSort.setEnabled(True)
        self.ui.groupBoxFilter.setEnabled(True)

##  ==========由connectSlotsByName() 自动连接的槽函数==================

    @pyqtSlot()  ##选择数据库,打开数据表
    def on_actOpenDB_triggered(self):
        dbFilename, flt = QFileDialog.getOpenFileName(
            self, "选择数据库文件", "", "SQL Lite数据库(*.db *.db3)")
        if (dbFilename == ''):
            return

        #打开数据库
        self.DB = QSqlDatabase.addDatabase("QSQLITE")  #添加 SQLITE数据库驱动
        self.DB.setDatabaseName(dbFilename)  #设置数据库名称
        ##    DB.setHostName()
        ##    DB.setUserName()
        ##    DB.setPassword()
        if self.DB.open():  #打开数据库
            self.__openTable()  #打开数据表
        else:
            QMessageBox.warning(self, "错误", "打开数据库失败")

    @pyqtSlot()  ##保存修改
    def on_actSubmit_triggered(self):
        res = self.tabModel.submitAll()
        if (res == False):
            QMessageBox.information(
                self, "消息", "数据保存错误,错误信息\n" + self.tabModel.lastError().text())
        else:
            self.ui.actSubmit.setEnabled(False)
            self.ui.actRevert.setEnabled(False)

    @pyqtSlot()  ##取消修改
    def on_actRevert_triggered(self):
        self.tabModel.revertAll()
        self.ui.actSubmit.setEnabled(False)
        self.ui.actRevert.setEnabled(False)

    @pyqtSlot()  ##添加记录
    def on_actRecAppend_triggered(self):
        self.tabModel.insertRow(self.tabModel.rowCount(),
                                QModelIndex())  #在末尾添加一个记录

        curIndex = self.tabModel.index(self.tabModel.rowCount() - 1,
                                       1)  #创建最后一行的ModelIndex
        self.selModel.clearSelection()  #清空选择项
        self.selModel.setCurrentIndex(
            curIndex, QItemSelectionModel.Select)  #设置刚插入的行为当前选择行

        currow = curIndex.row()  #获得当前行
        self.tabModel.setData(self.tabModel.index(currow,
                                                  self.fldNum["empNo"]),
                              2000 + self.tabModel.rowCount())  #自动生成编号
        self.tabModel.setData(
            self.tabModel.index(currow, self.fldNum["Gender"]), "男")

    @pyqtSlot()  ##插入记录
    def on_actRecInsert_triggered(self):
        curIndex = self.ui.tableView.currentIndex()  #QModelIndex
        self.tabModel.insertRow(curIndex.row(), QModelIndex())
        self.selModel.clearSelection()  #清除已有选择
        self.selModel.setCurrentIndex(curIndex, QItemSelectionModel.Select)

    @pyqtSlot()  ##删除记录
    def on_actRecDelete_triggered(self):
        curIndex = self.selModel.currentIndex()  #获取当前选择单元格的模型索引
        self.tabModel.removeRow(curIndex.row())  #删除当前行

    @pyqtSlot()  ##清除照片
    def on_actPhotoClear_triggered(self):
        curRecNo = self.selModel.currentIndex().row()
        curRec = self.tabModel.record(curRecNo)  #获取当前记录,QSqlRecord
        curRec.setNull("Photo")  #设置为空值
        self.tabModel.setRecord(curRecNo, curRec)
        self.ui.dbLabPhoto.clear()  #清除界面上的图片显示

    @pyqtSlot()  ##设置照片
    def on_actPhoto_triggered(self):
        fileName, filt = QFileDialog.getOpenFileName(self, "选择图片文件", "",
                                                     "照片(*.jpg)")
        if (fileName == ''):
            return

        file = QFile(fileName)  #fileName为图片文件名
        file.open(QIODevice.ReadOnly)
        try:
            data = file.readAll()  #QByteArray
        finally:
            file.close()

        curRecNo = self.selModel.currentIndex().row()
        curRec = self.tabModel.record(curRecNo)  #获取当前记录QSqlRecord
        curRec.setValue("Photo", data)  #设置字段数据
        self.tabModel.setRecord(curRecNo, curRec)

        pic = QPixmap()
        pic.loadFromData(data)
        W = self.ui.dbLabPhoto.width()
        self.ui.dbLabPhoto.setPixmap(pic.scaledToWidth(W))  #在界面上显示

    @pyqtSlot()  ##涨工资,遍历数据表所有记录
    def on_actScan_triggered(self):
        if (self.tabModel.rowCount() == 0):
            return

        for i in range(self.tabModel.rowCount()):
            aRec = self.tabModel.record(i)  #获取当前记录
            ##         salary=aRec.value("Salary").toFloat()      #错误,无需再使用toFloat()函数
            salary = aRec.value("Salary")
            salary = salary * 1.1
            aRec.setValue("Salary", salary)
            self.tabModel.setRecord(i, aRec)

        if (self.tabModel.submitAll()):
            QMessageBox.information(self, "消息", "涨工资计算完毕")

    @pyqtSlot(int)  ##排序字段变化
    def on_comboFields_currentIndexChanged(self, index):
        if self.ui.radioBtnAscend.isChecked():
            self.tabModel.setSort(index, Qt.AscendingOrder)
        else:
            self.tabModel.setSort(index, Qt.DescendingOrder)
        self.tabModel.select()

    @pyqtSlot()  ##升序
    def on_radioBtnAscend_clicked(self):
        self.tabModel.setSort(self.ui.comboFields.currentIndex(),
                              Qt.AscendingOrder)
        self.tabModel.select()

    @pyqtSlot()  ##降序
    def on_radioBtnDescend_clicked(self):
        self.tabModel.setSort(self.ui.comboFields.currentIndex(),
                              Qt.DescendingOrder)
        self.tabModel.select()

    @pyqtSlot()  ##过滤,男
    def on_radioBtnMan_clicked(self):
        self.tabModel.setFilter("Gender='男'")

    ##      print(self.tabModel.filter())
    ##      self.tabModel.select()

    @pyqtSlot()  ##数据过滤,女
    def on_radioBtnWoman_clicked(self):
        self.tabModel.setFilter("Gender='女' ")

    ##      print(self.tabModel.filter())
    ##      self.tabModel.select()

    @pyqtSlot()  ##取消数据过滤
    def on_radioBtnBoth_clicked(self):
        self.tabModel.setFilter("")

    ##      print(self.tabModel.filter())
    ##      self.tabModel.select()

##  =============自定义槽函数===============================

    def do_currentChanged(self, current, previous):  ##更新actPost和actCancel 的状态
        self.ui.actSubmit.setEnabled(self.tabModel.isDirty())  #有未保存修改时可用
        self.ui.actRevert.setEnabled(self.tabModel.isDirty())

    def do_currentRowChanged(self, current, previous):  #行切换时的状态控制
        self.ui.actRecDelete.setEnabled(current.isValid())
        self.ui.actPhoto.setEnabled(current.isValid())
        self.ui.actPhotoClear.setEnabled(current.isValid())

        if (current.isValid() == False):
            self.ui.dbLabPhoto.clear()  #清除图片显示
            return

        self.mapper.setCurrentIndex(current.row())  #更新数据映射的行号
        curRec = self.tabModel.record(current.row())  #获取当前记录,QSqlRecord类型

        if (curRec.isNull("Photo")):  #图片字段内容为空
            self.ui.dbLabPhoto.clear()
        else:
            ##         data=bytearray(curRec.value("Photo"))   #可以工作
            data = curRec.value("Photo")  # 也可以工作
            pic = QPixmap()
            pic.loadFromData(data)
            W = self.ui.dbLabPhoto.size().width()
            self.ui.dbLabPhoto.setPixmap(pic.scaledToWidth(W))
コード例 #6
0
class Ui(Ui_Form):
    def function(self):
        self.OutExcelButton.clicked.connect(self.OutExcel)  # 导出表格按钮
        self.InSQLButton.clicked.connect(self.InSQL)  # Excel导入信息按钮
        self.OutPutSQLButton.clicked.connect(self.OutSQL)  # 基本信息导出按钮
        self.CementDateButton.clicked.connect(self.CementDate)  # 水泥一览表信息按钮
        self.MixpushButton.clicked.connect(self.MixDate)  # 配合比表信息按钮
        self.ChangePrarmerButton.clicked.connect(
            self.ChangePrarmer)  # 确认修改参数按钮
        self.CementrefreshButton.clicked.connect(self.cement_refresh)  # 刷新
        self.CementsubmitButton.clicked.connect(self.cement_submit)  # 提交
        self.CementdelButton.clicked.connect(self.cement_del)  # 删除
        self.CementQueryButton.clicked.connect(self.query_cement)  # 查询
        self.mixrefreshButton.clicked.connect(self.mix_refresh)  # 刷新
        self.mixsubmitButton.clicked.connect(self.mix_submit)  # 提交
        self.MixDelButton.clicked.connect(self.mix_del)  # 删除
        self.MixqueryButton.clicked.connect(self.query_mix)  # 查询
        self.deletArtButton.clicked.connect(self.empty_Art)  # 水泥一览表数据清空
        self.deleMIXButton.clicked.connect(self.empty_Mix)  # 配合比表数据清空
        self.CementAddButton.clicked.connect(self.addArt)  # 添加水泥按钮
        self.mixAddButton.clicked.connect(self.addMix)  # 添加配合比按钮
        self.CementInfoButton.clicked.connect(self.CementInfo)  # 选择水泥一览表记录
        self.MixPoportionButton.clicked.connect(self.ConMixInsert)  # 选择配合比表记录
        self.ChoicConcreteUsageRecordButton.clicked.connect(
            self.ChoicConcreteUsageRecord)  # 选择使用记录表
        self.OutSQLButton_2.clicked.connect(self.ChoicSQLPath)  # 选择OutPutSQL路径
        self.OutSQLButton_3.clicked.connect(self.OutPutSQL)  # 导出SQL
        self.OutPutButton.clicked.connect(self.ouputexcel)  # 确认导出按钮
        self.OutPutVoidButton.clicked.connect(self.outputvoidexcel)  # 确认导出按钮
        # 查看数据库是否存在
        try:
            parm = get_parm()
            print('已获取SQL')
        except BaseException:
            print('创建SQL')
            from DateBase.creat import creat_table
            from DateBase.insert_value import parm_init
            creat_table()
            parm_init()
        # 填充信息
        parm = get_parm()
        self.MinC_StrengthEdit.setText(str(parm.MinC_Strength))
        self.MaxC_StrengthEdit.setText(str(parm.MaxC_Strength))
        self.MinS_FinenessDensityEdit.setText(str(parm.MinS_FinenessDensity))
        self.MaxS_FinenessDensityEdit.setText(str(parm.MaxS_FinenessDensity))
        self.MinS_SurfaceDensityEdit.setText(str(parm.MinS_SurfaceDensity))
        self.MaxS_SurfaceDensityEdit.setText(str(parm.MaxS_SurfaceDensity))
        self.MinS_DensityEdit.setText(str(parm.MinS_Density))
        self.MaxS_DensityEdit.setText(str(parm.MaxS_Density))
        self.MinS_SlitContentEdit.setText(str(parm.MinS_SlitContent))
        self.MaxS_SlitContentEdit.setText(str(parm.MaxS_SlitContent))
        self.MinS_WaterContentEdit.setText(str(parm.MinS_WaterContent))
        self.MaxS_WaterContentEdit.setText(str(parm.MaxS_WaterContent))
        self.MinG_GrainContentEdit.setText(str(parm.MinG_GrainContent))
        self.MaxG_GrainContentEdit.setText(str(parm.MaxG_GrainContent))
        self.MinG_CrushLevelEdit.setText(str(parm.MinG_CrushLevel))
        self.MaxG_CrushLevelEdit.setText(str(parm.MaxG_CrushLevel))
        self.MinG_DensityEdit.setText(str(parm.MinG_Density))
        self.MaxG_DensityEdit.setText(str(parm.MaxG_Density))
        self.MinG_SlitContentEdit.setText(str(parm.MinG_SlitContent))
        self.MaxG_SlitContentEdit.setText(str(parm.MaxG_SlitContent))
        self.MinG_WaterContentEdit.setText(str(parm.MinG_WaterContent))
        self.MaxG_WaterContentEdit.setText(str(parm.MaxG_WaterContent))
        self.MinA_DensityEdit.setText(str(parm.MinA_Density))
        self.MaxA_DensityEdit.setText(str(parm.MaxA_Density))
        self.MinR7_CompressionEdit.setText(str(parm.MinR7_Compression))
        self.MaxR7_CompressionEdit.setText(str(parm.MaxR7_Compression))
        self.MinR28_CompressionEdit.setText(str(parm.MinR28_Compression))
        self.MaxR28_CompressionEdit.setText(str(parm.MaxR28_Compression))
        _translate = QtCore.QCoreApplication.translate
        PicName = getpiname()
        for i in range(len(PicName)):
            self.Project1Manager.addItem("")
            self.Project1Manager.setItemText(i, _translate("Form", PicName[i]))
            self.Project1FillSheeter.addItem("")
            self.Project1FillSheeter.setItemText(
                i, _translate("Form", PicName[i]))
            self.Project2Manager.addItem("")
            self.Project2Manager.setItemText(i, _translate("Form", PicName[i]))
            self.Project2Checker.addItem("")
            self.Project2Checker.setItemText(i, _translate("Form", PicName[i]))
            self.Project2Try.addItem("")
            self.Project2Try.setItemText(i, _translate("Form", PicName[i]))
            self.Project3MakeSheet.addItem("")
            self.Project3MakeSheet.setItemText(i,
                                               _translate("Form", PicName[i]))
            self.Project4Manager.addItem("")
            self.Project4Manager.setItemText(i, _translate("Form", PicName[i]))
            self.Project4Checker.addItem("")
            self.Project4Checker.setItemText(i, _translate("Form", PicName[i]))
            self.Project4Calculate.addItem("")
            self.Project4Calculate.setItemText(i,
                                               _translate("Form", PicName[i]))
            self.Project5Manager.addItem("")
            self.Project5Manager.setItemText(i, _translate("Form", PicName[i]))
            self.Project5Filler.addItem("")
            self.Project5Filler.setItemText(i, _translate("Form", PicName[i]))
            self.Project7Manager.addItem("")
            self.Project7Manager.setItemText(i, _translate("Form", PicName[i]))
            self.Project7Checker.addItem("")
            self.Project7Checker.setItemText(i, _translate("Form", PicName[i]))
            self.Project7try.addItem("")
            self.Project7try.setItemText(i, _translate("Form", PicName[i]))
            self.Project9Manager.addItem("")
            self.Project9Manager.setItemText(i, _translate("Form", PicName[i]))
            self.Project9Checker.addItem("")
            self.Project9Checker.setItemText(i, _translate("Form", PicName[i]))
            self.Project9Record.addItem("")
            self.Project9Record.setItemText(i, _translate("Form", PicName[i]))
            self.Project10Manager.addItem("")
            self.Project10Manager.setItemText(i,
                                              _translate("Form", PicName[i]))
            self.Project10Examine.addItem("")
            self.Project10Examine.setItemText(i,
                                              _translate("Form", PicName[i]))
            self.Project10Checker.addItem("")
            self.Project10Checker.setItemText(i,
                                              _translate("Form", PicName[i]))
            self.Project11Manager.addItem("")
            self.Project11Manager.setItemText(i,
                                              _translate("Form", PicName[i]))
            self.Project11Checker.addItem("")
            self.Project11Checker.setItemText(i,
                                              _translate("Form", PicName[i]))
        self.Project1Manager.setCurrentText(str(parm.Project1Manager))
        self.Project1FillSheeter.setCurrentText(str(parm.Project1FillSheeter))
        self.Project2InspectCodeEdit.setText(str(parm.Project2InspectCodeEdit))
        self.Project2Manager.setCurrentText(str(parm.Project2Manager))
        self.Project2Checker.setCurrentText(str(parm.Project2Checker))
        self.Project2Try.setCurrentText(str(parm.Project2Try))
        self.Project3MakeSheet.setCurrentText(str(parm.Project3MakeSheet))
        self.Project3InspectCodeEdit.setText(str(parm.Project3InspectCodeEdit))
        self.Project4Manager.setCurrentText(str(parm.Project4Manager))
        self.Project4Checker.setCurrentText(str(parm.Project4Checker))
        self.Project4Calculate.setCurrentText(str(parm.Project4Calculate))
        self.Project4InspectCodeEdit.setText(str(parm.Project4InspectCodeEdit))
        self.Project5Manager.setCurrentText(str(parm.Project5Manager))
        self.Project5Filler.setCurrentText(str(parm.Project5Filler))
        self.Project7ConDesignSpeciEdit.setText(
            str(parm.Project7ConDesignSpeciEdit))
        self.Project7CodeEdit.setText(str(parm.Project7CodeEdit))
        self.Project7Manager.setCurrentText(str(parm.Project7Manager))
        self.Project7Checker.setCurrentText(str(parm.Project7Checker))
        self.Project7try.setCurrentText(str(parm.Project7try))
        self.Project9Manager.setCurrentText(str(parm.Project9Manager))
        self.Project9Checker.setCurrentText(str(parm.Project9Checker))
        self.Project9Record.setCurrentText(str(parm.Project9Record))
        self.Project10ConTestReportTestBasisEdit.setText(
            str(parm.Project10ConTestReportTestBasisEdit))
        self.Project10InspectCodeEdit.setText(
            str(parm.Project10InspectCodeEdit))
        from PyQt5.QtCore import QTime
        time = str(parm.Project10TimeEdit).split(':')
        time = QTime(int(time[0]), int(time[1]))
        self.Project10TimeEdit.setTime(time)
        self.Project10MaxCreepEdit.setText(str(parm.Project10MaxCreepEdit))
        self.Project10MinCreepEdit.setText(str(parm.Project10MinCreepEdit))
        self.Project10Manager.setCurrentText(str(parm.Project10Manager))
        self.Project10Examine.setCurrentText(str(parm.Project10Examine))
        self.Project10Checker.setCurrentText(str(parm.Project10Checker))
        self.Project11Manager.setCurrentText(str(parm.Project11Manager))
        self.Project11Checker.setCurrentText(str(parm.Project11Checker))
        # 插入水泥一览表
        self.con2 = QSqlDatabase.addDatabase('QSQLITE')
        self.con2.setDatabaseName(db_path)
        # con2.exec_("PRAGMA foreign_keys = ON;")

        self.CementMode = QSqlTableModel()
        self.CementMode.setTable("cement_attribute_data")
        self.CementMode.setSort(0, Qt.AscendingOrder)
        self.CementMode.setEditStrategy(self.CementMode.OnManualSubmit)
        self.CementMode.setHeaderData(0, Qt.Horizontal, "id")
        self.CementMode.setHeaderData(1, Qt.Horizontal, "进场日期")
        self.CementMode.setHeaderData(2, Qt.Horizontal, "水泥品种")
        self.CementMode.setHeaderData(3, Qt.Horizontal, "生产厂家")
        self.CementMode.setHeaderData(4, Qt.Horizontal, "生产日期")
        self.CementMode.setHeaderData(5, Qt.Horizontal, "编号")
        self.CementMode.setHeaderData(6, Qt.Horizontal, "数量(T)")
        self.CementMode.setHeaderData(7, Qt.Horizontal, "安定性")
        self.CementMode.setHeaderData(8, Qt.Horizontal, "初凝")
        self.CementMode.setHeaderData(9, Qt.Horizontal, "终凝")
        self.CementMode.setHeaderData(10, Qt.Horizontal, "R3抗压")
        self.CementMode.setHeaderData(11, Qt.Horizontal, "R28抗压")
        self.CementMode.setHeaderData(12, Qt.Horizontal, "R3抗折")
        self.CementMode.setHeaderData(13, Qt.Horizontal, "R28抗折")
        self.CementMode.setHeaderData(14, Qt.Horizontal, "是否优先")
        self.CementMode.select()
        self.CementtableView.setModel(self.CementMode)
        self.CementtableView.setSelectionMode(QTableView.SingleSelection)
        self.CementtableView.setSelectionBehavior(QTableView.SelectRows)
        self.CementtableView.resizeColumnsToContents()
        # 配合比表
        self.MixMode = QSqlTableModel()
        self.MixMode.setTable("concrete_mix")
        self.MixMode.setSort(0, Qt.AscendingOrder)
        self.MixMode.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.MixMode.setHeaderData(1 - 1, Qt.Horizontal, "名称")
        self.MixMode.setHeaderData(2 - 1, Qt.Horizontal, "配合比编号")
        self.MixMode.setHeaderData(3 - 1, Qt.Horizontal, "强度等级 ")
        self.MixMode.setHeaderData(4 - 1, Qt.Horizontal, "抗渗等级")
        self.MixMode.setHeaderData(5 - 1, Qt.Horizontal, "膨胀")
        self.MixMode.setHeaderData(6 - 1, Qt.Horizontal, "配合比编号2")
        self.MixMode.setHeaderData(7 - 1, Qt.Horizontal, "坍落度")
        self.MixMode.setHeaderData(8 - 1, Qt.Horizontal, "标准差(MPa)")
        self.MixMode.setHeaderData(9 - 1, Qt.Horizontal, "配制强度(MPa)")
        self.MixMode.setHeaderData(10 - 1, Qt.Horizontal, "水W")
        self.MixMode.setHeaderData(11 - 1, Qt.Horizontal, "水泥C")
        self.MixMode.setHeaderData(12 - 1, Qt.Horizontal, "粉煤灰F")
        self.MixMode.setHeaderData(13 - 1, Qt.Horizontal, "砂S")
        self.MixMode.setHeaderData(14 - 1, Qt.Horizontal, "石G")
        self.MixMode.setHeaderData(15 - 1, Qt.Horizontal, "水胶比A/P")
        self.MixMode.setHeaderData(16 - 1, Qt.Horizontal, "砂率 BS")
        self.MixMode.setHeaderData(17 - 1, Qt.Horizontal, "外加剂掺量A%")
        self.MixMode.setHeaderData(18 - 1, Qt.Horizontal, "外加剂用量LS-JS(B)")
        self.MixMode.setHeaderData(19 - 1, Qt.Horizontal, "膨胀剂用量")
        self.MixMode.setHeaderData(20 - 1, Qt.Horizontal, "质量密度  (容重)Mcp")
        self.MixMode.setHeaderData(21 - 1, Qt.Horizontal, "初凝时间")
        self.MixMode.setHeaderData(22 - 1, Qt.Horizontal, "终凝时间")
        self.MixMode.select()
        self.MixtableView.setModel(self.MixMode)
        self.MixtableView.setSelectionMode(QTableView.SingleSelection)
        self.MixtableView.setSelectionBehavior(QTableView.SelectRows)
        self.MixtableView.resizeColumnsToContents()
        if self.con2.isOpen():
            self.con2.close()

    def OutExcel(self):
        if self.con2.isOpen():
            self.con2.close()
        self.stackedWidget.setCurrentIndex(0)

    def InSQL(self):
        if self.con2.isOpen():
            self.con2.close()
        self.stackedWidget.setCurrentIndex(1)

    def OutSQL(self):
        if self.con2.isOpen():
            self.con2.close()
        self.stackedWidget.setCurrentIndex(2)

    def CementDate(self):
        self.stackedWidget.setCurrentIndex(3)
        self.cement_refresh()
        if not self.con2.isOpen():
            self.con2.open()
            self.CementMode = QSqlTableModel()
            self.CementMode.setTable("cement_attribute_data")
            self.CementMode.setSort(0, Qt.AscendingOrder)
            self.CementMode.setEditStrategy(self.CementMode.OnManualSubmit)
            self.CementMode.setHeaderData(0, Qt.Horizontal, "id")
            self.CementMode.setHeaderData(1, Qt.Horizontal, "进场日期")
            self.CementMode.setHeaderData(2, Qt.Horizontal, "水泥品种")
            self.CementMode.setHeaderData(3, Qt.Horizontal, "生产厂家")
            self.CementMode.setHeaderData(4, Qt.Horizontal, "生产日期")
            self.CementMode.setHeaderData(5, Qt.Horizontal, "编号")
            self.CementMode.setHeaderData(6, Qt.Horizontal, "数量(T)")
            self.CementMode.setHeaderData(7, Qt.Horizontal, "安定性")
            self.CementMode.setHeaderData(8, Qt.Horizontal, "初凝")
            self.CementMode.setHeaderData(9, Qt.Horizontal, "终凝")
            self.CementMode.setHeaderData(10, Qt.Horizontal, "R3抗压")
            self.CementMode.setHeaderData(11, Qt.Horizontal, "R28抗压")
            self.CementMode.setHeaderData(12, Qt.Horizontal, "R3抗折")
            self.CementMode.setHeaderData(13, Qt.Horizontal, "R28抗折")
            self.CementMode.setHeaderData(14, Qt.Horizontal, "是否优先")
            self.CementMode.select()
            self.CementtableView.setModel(self.CementMode)
            self.CementtableView.setSelectionMode(QTableView.SingleSelection)
            self.CementtableView.setSelectionBehavior(QTableView.SelectRows)
            self.CementtableView.resizeColumnsToContents()

    def MixDate(self):
        self.stackedWidget.setCurrentIndex(4)
        self.mix_refresh()
        if not self.con2.isOpen():
            self.con2.open()
            self.MixMode = QSqlTableModel()
            self.MixMode.setTable("concrete_mix")
            self.MixMode.setSort(0, Qt.AscendingOrder)
            self.MixMode.setEditStrategy(QSqlTableModel.OnManualSubmit)
            self.MixMode.setHeaderData(1 - 1, Qt.Horizontal, "名称")
            self.MixMode.setHeaderData(2 - 1, Qt.Horizontal, "配合比编号")
            self.MixMode.setHeaderData(3 - 1, Qt.Horizontal, "强度等级 ")
            self.MixMode.setHeaderData(4 - 1, Qt.Horizontal, "抗渗等级")
            self.MixMode.setHeaderData(5 - 1, Qt.Horizontal, "膨胀")
            self.MixMode.setHeaderData(6 - 1, Qt.Horizontal, "配合比编号2")
            self.MixMode.setHeaderData(7 - 1, Qt.Horizontal, "坍落度")
            self.MixMode.setHeaderData(8 - 1, Qt.Horizontal, "标准差(MPa)")
            self.MixMode.setHeaderData(9 - 1, Qt.Horizontal, "配制强度(MPa)")
            self.MixMode.setHeaderData(10 - 1, Qt.Horizontal, "水W")
            self.MixMode.setHeaderData(11 - 1, Qt.Horizontal, "水泥C")
            self.MixMode.setHeaderData(12 - 1, Qt.Horizontal, "粉煤灰F")
            self.MixMode.setHeaderData(13 - 1, Qt.Horizontal, "砂S")
            self.MixMode.setHeaderData(14 - 1, Qt.Horizontal, "石G")
            self.MixMode.setHeaderData(15 - 1, Qt.Horizontal, "水胶比A/P")
            self.MixMode.setHeaderData(16 - 1, Qt.Horizontal, "砂率 BS")
            self.MixMode.setHeaderData(17 - 1, Qt.Horizontal, "外加剂掺量A%")
            self.MixMode.setHeaderData(18 - 1, Qt.Horizontal, "外加剂用量LS-JS(B)")
            self.MixMode.setHeaderData(19 - 1, Qt.Horizontal, "膨胀剂用量")
            self.MixMode.setHeaderData(20 - 1, Qt.Horizontal, "质量密度  (容重)Mcp")
            self.MixMode.setHeaderData(21 - 1, Qt.Horizontal, "初凝时间")
            self.MixMode.setHeaderData(22 - 1, Qt.Horizontal, "终凝时间")
            self.MixMode.select()
            self.MixtableView.setModel(self.MixMode)
            self.MixtableView.setSelectionMode(QTableView.SingleSelection)
            self.MixtableView.setSelectionBehavior(QTableView.SelectRows)
            self.MixtableView.resizeColumnsToContents()

    def ChangePrarmer(self):
        if QMessageBox.question(QWidget(), "Question", "是否确定修改参数?",
                                QMessageBox.Ok | QMessageBox.Cancel,
                                QMessageBox.Ok) == QMessageBox.Ok:
            try:
                parm = Parameter(
                    MinC_Strength=float(self.MinC_StrengthEdit.text()),
                    MaxC_Strength=float(self.MaxC_StrengthEdit.text()),
                    MinS_FinenessDensity=float(
                        self.MinS_FinenessDensityEdit.text()),
                    MaxS_FinenessDensity=float(
                        self.MaxS_FinenessDensityEdit.text()),
                    MinS_SurfaceDensity=float(
                        self.MinS_SurfaceDensityEdit.text()),
                    MaxS_SurfaceDensity=float(
                        self.MaxS_SurfaceDensityEdit.text()),
                    MinS_Density=float(self.MinS_DensityEdit.text()),
                    MaxS_Density=float(self.MaxS_DensityEdit.text()),
                    MinS_SlitContent=float(self.MinS_SlitContentEdit.text()),
                    MaxS_SlitContent=float(self.MaxS_SlitContentEdit.text()),
                    MinS_WaterContent=float(self.MinS_WaterContentEdit.text()),
                    MaxS_WaterContent=float(self.MaxS_WaterContentEdit.text()),
                    MinG_GrainContent=float(self.MinG_GrainContentEdit.text()),
                    MaxG_GrainContent=float(self.MaxG_GrainContentEdit.text()),
                    MinG_CrushLevel=float(self.MinG_CrushLevelEdit.text()),
                    MaxG_CrushLevel=float(self.MaxG_CrushLevelEdit.text()),
                    MinG_Density=float(self.MinG_DensityEdit.text()),
                    MaxG_Density=float(self.MaxG_DensityEdit.text()),
                    MinG_SlitContent=float(self.MinG_SlitContentEdit.text()),
                    MaxG_SlitContent=float(self.MaxG_SlitContentEdit.text()),
                    MinG_WaterContent=float(self.MinG_WaterContentEdit.text()),
                    MaxG_WaterContent=float(self.MaxG_WaterContentEdit.text()),
                    MinA_Density=float(self.MinA_DensityEdit.text()),
                    MaxA_Density=float(self.MaxA_DensityEdit.text()),
                    MinR7_Compression=float(self.MinR7_CompressionEdit.text()),
                    MaxR7_Compression=float(self.MaxR7_CompressionEdit.text()),
                    MinR28_Compression=float(
                        self.MinR28_CompressionEdit.text()),
                    MaxR28_Compression=float(
                        self.MaxR28_CompressionEdit.text()),
                    Project1Manager=self.Project1Manager.currentText(),
                    Project1FillSheeter=self.Project1FillSheeter.currentText(),
                    Project2InspectCodeEdit=self.Project2InspectCodeEdit.text(
                    ),
                    Project2Manager=self.Project2Manager.currentText(),
                    Project2Checker=self.Project2Checker.currentText(),
                    Project2Try=self.Project2Try.currentText(),
                    Project3MakeSheet=self.Project3MakeSheet.currentText(),
                    Project3InspectCodeEdit=self.Project3InspectCodeEdit.text(
                    ),
                    Project4Manager=self.Project4Manager.currentText(),
                    Project4Checker=self.Project4Checker.currentText(),
                    Project4Calculate=self.Project4Calculate.currentText(),
                    Project4InspectCodeEdit=self.Project4InspectCodeEdit.text(
                    ),
                    Project5Manager=self.Project5Manager.currentText(),
                    Project5Filler=self.Project5Filler.currentText(),
                    Project7ConDesignSpeciEdit=self.Project7ConDesignSpeciEdit.
                    text(),
                    Project7CodeEdit=self.Project7CodeEdit.text(),
                    Project7Manager=self.Project7Manager.currentText(),
                    Project7Checker=self.Project7Checker.currentText(),
                    Project7try=self.Project7try.currentText(),
                    Project9Manager=self.Project9Manager.currentText(),
                    Project9Checker=self.Project9Checker.currentText(),
                    Project9Record=self.Project9Record.currentText(),
                    Project10ConTestReportTestBasisEdit=self.
                    Project10ConTestReportTestBasisEdit.text(),
                    Project10InspectCodeEdit=self.Project10InspectCodeEdit.
                    text(),
                    Project10TimeEdit=self.Project10TimeEdit.text(),
                    Project10MaxCreepEdit=self.Project10MaxCreepEdit.text(),
                    Project10MinCreepEdit=self.Project10MinCreepEdit.text(),
                    Project10Manager=self.Project10Manager.currentText(),
                    Project10Examine=self.Project10Examine.currentText(),
                    Project10Checker=self.Project10Checker.currentText(),
                    Project11Manager=self.Project11Manager.currentText(),
                    Project11Checker=self.Project11Checker.currentText())
                session.add(parm)
                session.commit()
                QMessageBox.information(QWidget(), "修改", "成功")
            except BaseException:
                QMessageBox.information(QWidget(), "错误",
                                        "修改失败!!!!\n请核对数据是否有误或留空白。")

    def cement_refresh(self):
        self.CementMode.setFilter("1=1")
        self.CementMode.select()

    def cement_submit(self):
        if (QMessageBox.question(QWidget(), "修改", "是否确定修改", QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.Yes):
            try:
                self.CementMode.submitAll()
                QMessageBox.about(QWidget(), '修改', '修改成功')
            except BaseException:
                QMessageBox.about(QWidget(), '失败', '失败')

    def cement_del(self):
        try:
            index = self.CementtableView.currentIndex()
            self.CementMode.removeRow(index.row())
            self.CementMode.submitAll()
            self.CementMode.select()

        except BaseException:
            QMessageBox.about(QWidget(), '失败', '失败')

    def query_cement(self):
        CementId = self.CementIdEdit_2.text()
        IsPriority = self.IsPriorityEdit.text()
        sql = "1=1 "
        if CementId != '':
            sql = sql + \
                "and CementId like '%CementId_1%' ".replace('CementId_1', CementId)
        if IsPriority != '':
            sql = sql + \
                "and PriorityLevel like '%PriorityLevel_1%' ".replace('PriorityLevel_1', IsPriority)
        print(sql)
        self.CementMode.setFilter(sql)
        self.CementMode.select()

    def mix_refresh(self):
        self.MixMode.setFilter("1=1")
        self.CementMode.select()

    def mix_submit(self):
        if (QMessageBox.question(QWidget(), "修改", "是否确定修改", QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.Yes):
            try:
                self.MixMode.submitAll()
                QMessageBox.about(QWidget(), '修改', '修改成功')
            except BaseException:
                QMessageBox.about(QWidget(), '失败', '失败')

    def mix_del(self):
        try:
            index = self.MixtableView.currentIndex()
            self.MixMode.removeRow(index.row())
            self.MixMode.submitAll()
            self.MixMode.select()

        except BaseException:
            QMessageBox.about(QWidget(), '失败', '失败')

    def query_mix(self):
        MixName = self.MixNameEdit.text()
        MixId = self.MixIdEdit.text()
        MixStrength = self.MixStrengthEdit.text()
        MixLevel = self.MixLevelEdit.text()
        sql = "1=1 "
        if MixName != '':
            sql = sql + \
                "and ConcreteName like '%MixName_1%' ".replace('MixName_1', MixName)
        if MixId != '':
            sql = sql + \
                "and MixRatioID like '%MixId_1%' ".replace('MixId_1', MixId)
        if MixStrength != '':
            sql = sql + \
                "and StrengthLevel like '%MixStrength_1%' ".replace('MixStrength_1', MixStrength)
        if MixLevel != '':
            sql = sql + \
                "and ImperLevel like '%MixLevel_1%' ".replace('MixLevel_1', MixLevel)
        print(sql)
        self.MixMode.setFilter(sql)
        self.MixMode.select()

    def empty_Art(self):
        if (QMessageBox.question(QWidget(), "删除", "是否确定删除所有数据", QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.Yes):
            try:
                self.con2.exec_("delete from cement_attribute_data")
                self.CementMode.select()
                QMessageBox.about(QWidget(), '删除', '删除成功')
            except BaseException:
                QMessageBox.about(QWidget(), '失败', '失败')

    def empty_Mix(self):
        if (QMessageBox.question(QWidget(), "删除", "是否确定删除所有数据", QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.Yes):
            try:
                self.con2.exec_("delete from concrete_mix")
                self.MixMode.select()
                QMessageBox.about(QWidget(), '删除', '删除成功')
            except BaseException:
                QMessageBox.about(QWidget(), '失败', '失败')

    def addArt(self):
        try:
            row = self.CementMode.rowCount()
            self.CementMode.insertRow(row)
            index = self.CementMode.index(row, 0)
            self.CementtableView.setCurrentIndex(index)
            self.CementtableView.edit(index)
            self.CementMode.submit()
        except BaseException:
            QMessageBox.about(QWidget(), '失败', '失败')

    def addMix(self):
        try:
            row = self.MixMode.rowCount()
            self.MixMode.insertRow(row)
            index = self.MixMode.index(row, 0)
            self.MixtableView.setCurrentIndex(index)
            self.MixtableView.edit(index)
            self.MixMode.submit()
        except BaseException:
            QMessageBox.about(QWidget(), '失败', '失败')

    def CementInfo(self):
        from DateBase.insert_value import insert_cement_attribute_data
        try:
            filePath, filetype = QFileDialog.getOpenFileName(
                QWidget(), "选取水泥资料一览表", "../", "Text Files (*.xlsx)")
            if filePath == '':
                raise Exception('请选择文件夹')
            self.CementInfoPath.setText(filePath)
            filename = self.CementInfoPath.text()
            print(filename)
            insert_cement_attribute_data(filename)
            QMessageBox.information(QWidget(), "成功", "水泥资料一览表导入成功")
        except BaseException:
            QMessageBox.information(QWidget(), "错误",
                                    "添加失败!!!!!\n请检查水泥资料一览表表格的数据格式。\n添加失败!!!!")

    def ConMixInsert(self):
        from DateBase.insert_value import insert_concrete_mix
        try:
            filePath, filetype = QFileDialog.getOpenFileName(
                QWidget(), "选取配合比选用汇总表", "../", "Text Files (*.xlsx)")
            if filePath == '':
                raise Exception('请选择文件夹')
            self.MixPoportionPath.setText(filePath)
            filename = self.MixPoportionPath.text()
            print('ss')
            insert_concrete_mix(filename)
            QMessageBox.information(QWidget(), "成功", "配合比选用汇总表导入成功")
        except BaseException:
            QMessageBox.information(QWidget(), "错误",
                                    "添加失败!!!!!\n请检查配合比选用汇总表格的数据格式。\n添加失败!!!!")

    def ChoicConcreteUsageRecord(self):
        try:
            filePath, filetype = QFileDialog.getOpenFileName(
                QWidget(), "选取水泥使用一览表", "../", "Text Files (*.xlsx)")
            if filePath == '':
                raise Exception('请选择文件夹')
            self.ConcreteUsageRecordPath.setText(filePath)
            self.OutPutButton.setEnabled(True)
            self.OutPutVoidButton.setEnabled(True)
        except BaseException:
            pass

    def ChoicSQLPath(self):
        try:
            filePath = QFileDialog.getExistingDirectory(
                QWidget(),
                "选取生成表格的文件夹",
                "../",
            )
            print(filePath)
            if filePath == '':
                print('没有选中文件')
                raise Exception('请选择文件夹')
            self.OutSQLButton_3.setEnabled(True)
            self.OutSQLPath.setText(filePath)
        except BaseException:
            pass

    def OutPutSQL(self):
        try:
            art = session.query(CementAttributeDatum).all()
            mix = session.query(ConcreteMix).all()
            wb = Workbook()
            ws = wb.active
            ws['A1'] = '水泥资料一览表'
            ws.merge_cells('A1:N1')
            ws['A2'] = '进场日期'
            ws['B2'] = '水泥品种'
            ws['C2'] = '生产厂家'
            ws['D2'] = '生产日期'
            ws['E2'] = '编号'
            ws['F2'] = '数量(T)'
            ws['G2'] = '安定性'
            ws['H2'] = '初凝'
            ws['I2'] = '终凝'
            ws['J2'] = 'R3抗压'
            ws['K2'] = 'R28抗压'
            ws['L2'] = 'R3抗折'
            ws['M2'] = 'R28抗折'
            ws['N2'] = '是否优先'
            for i in range(len(art)):
                one_art = art[i]
                ws['A' + str(i + 3)] = one_art.ArrivalTime
                ws['B' + str(i + 3)] = one_art.CementVariety
                ws['C' + str(i + 3)] = one_art.Manufacturer
                ws['D' + str(i + 3)] = one_art.ProductionDate
                ws['E' + str(i + 3)] = one_art.CementId
                ws['F' + str(i + 3)] = one_art.CementNumber
                if one_art.IsStability == 1:
                    ws['G' + str(i + 3)] = '合格'
                else:
                    ws['G' + str(i + 3)] = '不合格'
                ws['H' + str(i + 3)] = one_art.InitialTime
                ws['I' + str(i + 3)] = one_art.FinalTime
                ws['J' + str(i + 3)] = one_art.R3_Compression
                ws['K' + str(i + 3)] = one_art.R28_Compression
                ws['L' + str(i + 3)] = one_art.R3_Bending
                ws['M' + str(i + 3)] = one_art.R28_Bending
                ws['N' + str(i + 3)] = one_art.PriorityLevel
            wb.save(self.OutSQLPath.text() + '/水泥一览表test.xlsx')
            # SQL配合比表
            wb = Workbook()
            ws = wb.active
            ws['A1'] = '佛山市三水区建友混凝土有限公司'
            ws['A2'] = '配合比选用汇总表'
            ws.merge_cells('A1:W1')
            ws.merge_cells('A2:W2')
            ws['A4'] = '名称'
            ws['B4'] = '配合比编号'
            ws['C4'] = '强度等级 '
            ws.merge_cells('C4:D4')
            ws['E4'] = '抗渗等级'
            ws['F4'] = '膨胀'
            ws['G4'] = '配合比编号'
            ws['H4'] = '坍落度'
            ws['I4'] = '标准差(MPa)'
            ws['J4'] = '配制强度(MPa)W'
            ws['K4'] = '水W'
            ws['L4'] = '水泥C'
            ws['M4'] = '粉煤灰F'
            ws['N4'] = '砂S'
            ws['O4'] = '石G'
            ws['P4'] = '水胶比A/P'
            ws['Q4'] = '砂率 BS'
            ws['R4'] = '外加剂掺量A%'
            ws['S4'] = '外加剂用量LS-JS(B)'
            ws['T4'] = '膨胀剂用量'
            ws['U4'] = '质量密度  (容重)Mcp'
            ws['V4'] = '初凝时间'
            ws['W4'] = '终凝时间'
            for i in range(len(mix)):
                ws['C' + str(i + 5)] = 'C'
                ws['A' + str(i + 5)] = mix[i].ConcreteName
                ws['B' + str(i + 5)] = mix[i].MixRatioID
                ws['D' + str(i + 5)] = mix[i].StrengthLevel
                ws['E' + str(i + 5)] = mix[i].ImperLevel
                if mix[i].ImperLevel is None:
                    ws['E' + str(i + 5)] = '/'
                ws['F' + str(i + 5)] = mix[i].SwellLevel
                if mix[i].SwellLevel is None:
                    ws['F' + str(i + 5)] = '/'
                ws['G' + str(i + 5)] = mix[i].MixRatioName
                ws['H' + str(i + 5)] = mix[i].SlumpNum
                ws['I' + str(i + 5)] = mix[i].StandardDeviation
                ws['J' + str(i + 5)] = mix[i].ConcreteStrengh
                ws['K' + str(i + 5)] = mix[i].WaterNum
                ws['L' + str(i + 5)] = mix[i].CementNum
                ws['N' + str(i + 5)] = mix[i].FlyashNum
                ws['M' + str(i + 5)] = mix[i].SandNum
                ws['O' + str(i + 5)] = mix[i].GravelNum
                ws['P' + str(i + 5)] = mix[i].CementRatio
                ws['Q' + str(i + 5)] = mix[i].SandRatio
                ws['R' + str(i + 5)] = mix[i].AdmixtureAmount
                ws['S' + str(i + 5)] = mix[i].AdmixtureNum
                ws['T' + str(i + 5)] = mix[i].SwellingNum
                ws['U' + str(i + 5)] = mix[i].MassDensity
                ws['V' + str(i + 5)] = mix[i].InitialTime
                ws['W' + str(i + 5)] = mix[i].FinalTime
            wb.save(self.OutSQLPath.text() + '/配合比表test.xlsx')
            QMessageBox.information(QWidget(), "成功", "请在刚刚选中的目录下查看文件")
        except BaseException:
            QMessageBox.information(QWidget(), "错误",
                                    "添加失败!!!!!\n请检查配合比选用汇总表格的数据格式。\n添加失败!!!!")

    def ouputexcel(self):
        try:
            books = []
            book = load_workbook(self.ConcreteUsageRecordPath.text())
            print('成功读取水泥使用记录表')
            # 生成12份表格
            book1, book7 = ConUseBuyRecord(book)
            print("17")
            book2, book3, book4 = ConStrengReport(book)
            print("234")
            book5 = CreateConFacyoryCard(book, book1)
            print("5")
            book6 = CreateSlumpCard(book5)
            print("6")
            book8 = CreteConUseProve(book)
            print("8")
            book9 = ConQualityRecord(book, book3, book7)
            print("9")
            book10 = PermeabilityTestReport(book, book7)
            print("10")
            books.append(book1)
            books.append(book2)
            books.append(book3)
            books.append(book4)
            books.append(book5)
            books.append(book6)
            books.append(book7)
            books.append(book8)
            books.append(book9)
            books.append(book10)
        except BaseException:
            print("读取失败")
        try:
            # 文件名处理
            fileNames = [
                '1、水泥购进、使用一览表', '2、混凝土试件抗压强度检验报告', '3、混凝土试块强度试验结果汇总表',
                '4、标准养护混凝土抗压强度计算表', '5、建友商品混凝土出厂合格证', '6、混凝土坍落度验收表',
                '7、混凝土配合比设计报告', '8、工地使用预拌混凝土证明书', '9、混凝土搅拌质量记录表',
                '10、抗渗性能检测报告', '11、施工配合比'
            ]
            filePath = QFileDialog.getExistingDirectory(
                QWidget(),
                "选取生成表格的文件夹",
                "C:/",
            )
            print(filePath)
            if filePath == '':
                print('没有选中文件')
                raise Exception('请选择文件夹')
            filePaths = []  # 存放文件路劲
            for i in fileNames:
                filePaths.append(filePath + '/' + i + '.xlsx')
            for j in range(1, 11):
                books[j - 1].save(filePaths[j - 1])
            # 记录
            filePaths = []
            filePath = his()
            for i in fileNames:
                filePaths.append(filePath + '/' + i + '.xlsx')
            print(filePaths)
            for j in range(1, 11):
                books[j - 1].save(filePaths[j - 1])
            QMessageBox.information(QWidget(), "成功导出", "请在您刚刚选定的文件夹内查看生成的文件")
        except BaseException:
            QMessageBox.information(QWidget(), "错误", "添加失败!!!!!\n添加失败!!!!")

    def outputvoidexcel(self):
        from Excel.CreateMode.CreateConFactoryCardMode17 import ConUseBuyRecordMode
        from Excel.CreateMode.CreateConStrentReportMode234 import ConStrengReportMode
        from Excel.CreateMode.CreateConFactoryCardMode56 import CreateConFacyoryCardMode, CreateSlumpCardMode
        from Excel.CreateMode.ConUseProveMode8 import CreteConUseProveMode
        from Excel.CreateMode.ConQualityRecordMode9 import ConQualityRecordMode
        from Excel.CreateMode.PermeabilityTestReportMode10 import PermeabilityTestReportMode
        try:
            books = []
            book = load_workbook(self.ConcreteUsageRecordPath.text())
            print('成功读取水泥使用记录表')
            # 生成12份表格
            book1, book7 = ConUseBuyRecordMode(book)
            print("17")
            book2, book3, book4 = ConStrengReportMode(book)
            print("234")
            book5 = CreateConFacyoryCardMode(book)
            print("5")
            book6 = CreateSlumpCardMode(book5)
            print("6")
            book8 = CreteConUseProveMode(book)
            print("8")
            book9 = ConQualityRecordMode(book)
            print("9")
            book10 = PermeabilityTestReportMode(book)
            print("10")
            books.append(book1)
            books.append(book2)
            books.append(book3)
            books.append(book4)
            books.append(book5)
            books.append(book6)
            books.append(book7)
            books.append(book8)
            books.append(book9)
            books.append(book10)
        except BaseException:
            print("读取失败")
        try:
            # 文件名处理
            fileNames = [
                '1、水泥购进、使用一览表', '2、混凝土试件抗压强度检验报告', '3、混凝土试块强度试验结果汇总表',
                '4、标准养护混凝土抗压强度计算表', '5、建友商品混凝土出厂合格证', '6、混凝土坍落度验收表',
                '7、混凝土配合比设计报告', '8、工地使用预拌混凝土证明书', '9、混凝土搅拌质量记录表',
                '10、抗渗性能检测报告', '11、施工配合比'
            ]
            filePath = QFileDialog.getExistingDirectory(
                QWidget(),
                "选取生成表格的文件夹",
                "C:/",
            )
            print(filePath)
            if filePath == '':
                print('没有选中文件')
                raise Exception('请选择文件夹')
            filePaths = []  # 存放文件路劲
            for i in fileNames:
                filePaths.append(filePath + '/' + i + '空白.xlsx')
            for j in range(1, 11):
                books[j - 1].save(filePaths[j - 1])
            QMessageBox.information(QWidget(), "成功导出", "请在您刚刚选定的文件夹内查看生成的文件")
        except BaseException:
            QMessageBox.information(QWidget(), "错误", "添加失败!!!!!\n添加失败!!!!")
コード例 #7
0
ファイル: 0701.py プロジェクト: falomsc/pyqtStudy
class QmyMainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setCentralWidget(self.ui.splitter)

        self.ui.tableView.setSelectionBehavior(QAbstractItemView.SelectItems)
        self.ui.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
        self.ui.tableView.setAlternatingRowColors(True)
        self.ui.tableView.verticalHeader().setDefaultSectionSize(22)
        self.ui.tableView.horizontalHeader().setDefaultSectionSize(60)

    def __openTable(self):
        self.tabModel = QSqlTableModel(self, self.DB)
        self.tabModel.setTable("employee")
        self.tabModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.tabModel.setSort(self.tabModel.fieldIndex("empNo"), Qt.AscendingOrder)
        if(self.tabModel.select()==False):
            QMessageBox.critical(self, "错误信息", "打开数据表错误,错误信息\n"+self.tabModel.lastError().text())
            return
        self.__getFieldNames()

        self.tabModel.setHeaderData(self.fldNum["empNo"], Qt.Horizontal, "工号")
        self.tabModel.setHeaderData(self.fldNum["Name"], Qt.Horizontal, "姓名")
        self.tabModel.setHeaderData(self.fldNum["Gender"], Qt.Horizontal, "性别")
        self.tabModel.setHeaderData(self.fldNum["Birthday"], Qt.Horizontal, "出生日期")
        self.tabModel.setHeaderData(self.fldNum["Province"], Qt.Horizontal, "省份")
        self.tabModel.setHeaderData(self.fldNum["Department"], Qt.Horizontal, "部门")
        self.tabModel.setHeaderData(self.fldNum["Salary"], Qt.Horizontal, "工资")
        self.tabModel.setHeaderData(self.fldNum["Memo"], Qt.Horizontal, "备注")
        self.tabModel.setHeaderData(self.fldNum["Photo"], Qt.Horizontal, "照片")

        self.mapper = QDataWidgetMapper()
        self.mapper.setModel(self.tabModel)
        self.mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)
        self.mapper.addMapping(self.ui.dbSpinEmpNo, self.fldNum["empNo"])
        self.mapper.addMapping(self.ui.dbEditName, self.fldNum["Name"])
        self.mapper.addMapping(self.ui.dbComboSex, self.fldNum["Gender"])
        self.mapper.addMapping(self.ui.dbEditBirth, self.fldNum["Birthday"])
        self.mapper.addMapping(self.ui.dbComboProvince, self.fldNum["Province"])
        self.mapper.addMapping(self.ui.dbComboDep, self.fldNum["Department"])
        self.mapper.addMapping(self.ui.dbSpinSalary, self.fldNum["Salary"])
        self.mapper.addMapping(self.ui.dbEditMemo, self.fldNum["Memo"])
        self.mapper.toFirst()

        self.selModel = QItemSelectionModel(self.tabModel)
        self.selModel.currentChanged.connect(self.do_currentChanged)
        self.selModel.currentRowChanged.connect(self.do_currentRowChanged)

        self.ui.tableView.setModel(self.tabModel)
        self.ui.tableView.setSelectionModel(self.selModel)

        self.ui.tableView.setColumnHidden(self.fldNum["Memo"], True)
        self.ui.tableView.setColumnHidden(self.fldNum["Photo"], True)


        strList = ("男", "女")
        self.__delegatesex = QmyComboBoxDelegate()
        self.__delegatesex.setItems(strList, False)
        self.ui.tableView.setItemDelegateForColumn(self.fldNum["Gender"], self.__delegatesex)

        strList = ("销售部", "技术部", "生产部", "行政部")
        self.__delegateDepart = QmyComboBoxDelegate()
        self.__delegateDepart.setItems(strList, True)
        self.ui.tableView.setItemDelegateForColumn(self.fldNum["Department"], self.__delegateDepart)

        self.ui.actOpenDB.setEnabled(False)
        self.ui.actOpenDB.setEnabled(False)

        self.ui.actRecAppend.setEnabled(True)
        self.ui.actRecInsert.setEnabled(True)
        self.ui.actRecDelete.setEnabled(True)
        self.ui.actScan.setEnabled(True)

        self.ui.groupBoxSort.setEnabled(True)
        self.ui.groupBoxFilter.setEnabled(True)


    def __getFieldNames(self):
        emptyRec = self.tabModel.record()
        self.fldNum = {}
        for i in range(emptyRec.count()):
            fieldName = emptyRec.fieldName(i)
            self.ui.comboFields.addItem(fieldName)
            self.fldNum.setdefault(fieldName)
            self.fldNum[fieldName]=i
        print(self.fldNum)

    def do_currentChanged(self, current, previous):
        self.ui.actSubmit.setEnabled(self.tabModel.isDirty())
        self.ui.actRevert.setEnabled(self.tabModel.isDirty())

    def do_currentRowChanged(self, current, previous):
        self.ui.actRecDelete.setEnabled(current.isValid())
        self.ui.actPhoto.setEnabled(current.isValid())
        self.ui.actPhotoClear.setEnabled(current.isValid())

        if(current.isValid() == False):
            self.ui.dbLabPhoto.clear()
            return

        self.mapper.setCurrentIndex(current.row())
        curRec = self.tabModel.record(current.row())

        if(curRec.isNull("Photo")):
            self.ui.dbLabPhoto.clear()
        else:
            data = curRec.value("Photo")
            pic = QPixmap()
            pic.loadFromData(data)
            w = self.ui.dbLabPhoto.size().width()
            self.ui.dbLabPhoto.setPixmap(pic.scaledToWidth(w))

    @pyqtSlot()
    def on_actOpenDB_triggered(self):
        dbFilename ,flt = QFileDialog.getOpenFileName(self, "选择数据库文件", "", "SQL Lite数据库(*.db *.db3)")
        if (dbFilename == ''):
            return
        self.DB = QSqlDatabase.addDatabase("QSQLITE")
        self.DB.setDatabaseName(dbFilename)
        if self.DB.open():
            self.__openTable()
        else:
            QMessageBox.warning(self, "错误", "打开数据库失败")

    @pyqtSlot()
    def on_actSubmit_triggered(self):
        res = self.tabModel.submitAll()
        if(res == False):
            QMessageBox.information(self, "消息", "数据保存错误,错误信息\n" + self.tabModel.lastError().text())
        else:
            self.ui.actSubmit.setEnabled(False)
            self.ui.actRevert.setEnabled(False)


    @pyqtSlot()
    def on_actRevert_triggered(self):
        self.tabModel.revertAll()
        self.ui.actSubmit.setEnabled(False)
        self.ui.actRevert.setEnabled(False)

    @pyqtSlot()
    def on_actRecAppend_triggered(self):
        self.tabModel.insertRow(self.tabModel.rowCount(), QModelIndex())
        curIndex = self.tabModel.index(self.tabModel.rowCount()-1, 1)
        self.selModel.clearSelection()
        self.selModel.setCurrentIndex(curIndex, QItemSelectionModel.Select)
        currow = curIndex.row()
        self.tabModel.setData(self.tabModel.index(currow, self.fldNum["empNo"]), 2000+self.tabModel.rowCount())
        self.tabModel.setData(self.tabModel.index(currow, self.fldNum["Gender"]), "男")

    @pyqtSlot()
    def on_actRecInsert_triggered(self):
        curIndex = self.ui.tableView.currentIndex()
        self.tabModel.insertRow(curIndex.row(), QModelIndex())
        self.selModel.clearSelection()
        self.selModel.setCurrentIndex(curIndex, QItemSelectionModel.Select)

    @pyqtSlot()
    def on_actRecDelete_triggered(self):
        curIndex = self.selModel.currentIndex()
        self.tabModel.removeRow(curIndex.row())

    @pyqtSlot()
    def on_actPhotoClear_triggered(self):
        curRecNo = self.selModel.currentIndex().row()
        curRec = self.tabModel.record(curRecNo)
        curRec.setNull("Photo")
        self.tabModel.setRecord(curRecNo, curRec)
        self.ui.dbLabPhoto.clear()

    @pyqtSlot()
    def on_actPhoto_triggered(self):
        fileName, filt = QFileDialog.getOpenFileName(self, "选择图片文件", "", "照片(*.jpg")
        if(fileName==''):
            return
        file=QFile(fileName)
        file.open(QIODevice.ReadOnly)
        try:
            data = file.readAll()
        finally:
            file.close()

        curRecNo = self.selModel.currentIndex().row()
        curRec = self.tabModel.record(curRecNo)
        curRec.setValue("Photo", data)
        self.tabModel.setRecord(curRecNo, curRec)

        pic = QPixmap()
        pic.loadFromData(data)
        w = self.ui.dbLabPhoto.width()
        self.ui.dbLabPhoto.setPixmap(pic.scaledToWidth(w))

    @pyqtSlot()
    def on_actScan_triggered(self):
        if(self.tabModel.rowCount()==0):
            return
        for i in range(self.tabModel.rowCount()):
            aRec = self.tabModel.record(i)
            salary = aRec.value("Salary")
            salary = salary*1.1
            aRec.setValue("Salary", salary)
            self.tabModel.setRecord(i, aRec)

        if(self.tabModel.submitAll()):
            QMessageBox.information(self, "消息", "涨工资计算完毕了")

    @pyqtSlot()
    def on_comboFields_currentIndexChanged(self, index):
        if self.ui.radioBtnAscend.isChecked():
            self.tabModel.setSort(index, Qt.AscendingOrder)
        else:
            self.tabModel.setSort(index, Qt.DescendingOrder)
        self.tabModel.select()

    @pyqtSlot()
    def on_radioBtnAscend_clicked(self):
        self.tabModel.setSort(self.ui.comboFields.currentIndex(), Qt.AscendingOrder)
        self.tabModel.select()

    @pyqtSlot()
    def on_radioBtnDescend_clicked(self):
        self.tabModel.setSort(self.ui.comboFields.currentIndex(), Qt.DescendingOrder)
        self.tabModel.select()

    @pyqtSlot()
    def on_radioBtnMan_clicked(self):
        self.tabModel.setFilter("Gender='男'")

    @pyqtSlot()
    def on_radioBtnWoman_clicked(self):
        self.tabModel.setFilter("Gender='女'")

    @pyqtSlot()
    def on_radioBtnBoth_clicked(self):
        self.tabModel.setFilter("")
コード例 #8
0
ファイル: CommodityData.py プロジェクト: Huangxiaoze/learngit
class Commodity(QTableView):
    def __init__(self):
        super().__init__()
        self.db = None
        self.db_connect()
        self.CreateTable()
        self.sql_exec()

    def db_connect(self):
        self.db = QSqlDatabase.addDatabase('QSQLITE')  # 1
        self.db.setDatabaseName('./tes.db')  # 2
        if not self.db.open():  # 3
            QMessageBox.critical(self, 'Database Connection',
                                 self.db.lastError().text())

    def closeEvent(self, QCloseEvent):  # 4
        self.db.close()

    def CreateTable(self):
        query = QSqlQuery()
        query.exec_(
            "create table yingyee(date VARCHAR(20) primary key,name VARCHAR(20),total VARCHAR(20),status VARCHAR(20))"
        )
        query.exec_(
            "CREATE TABLE sh(number VARCHAR(20) PRIMARY KEY, name VARCHAR(20) NOT NULL, unit VARCHAR(20))"
        )
        s = ""
        for i in range(1, 11):
            s += "No{0} VARCHAR(20),goods{6} VARCHAR(20),unit{1} VARCHAR(20),guige{2} VARCHAR(20),amount{3} VARCHAR(20),danjia{4} VARCHAR(20),money{7} VARCHAR(20),beizhu{5} VARCHAR(20),".format(
                i, i, i, i, i, i, i, i)
        print(s)
        query.exec_("CREATE TABLE Kucun("
                    "date VARCHAR(20) primary key,"
                    " name VARCHAR(20) NOT NULL,"
                    " bianhao VARCHAR(20),"
                    "cangku VARCHAR(20),"
                    "tel VARCHAR(20),"
                    "address VARCHAR(20),"
                    "zhidan VARCHAR(20),"
                    "jinshou VARCHAR(20),"
                    "shoukuan VARCHAR(20),"
                    "fahuo VARCHAR(20),"
                    "kehuqianzi VARCHAR(20)," + s + "total VARCHAR(20))")
        """
        query.exec_("insert into Kucun(date,name,bianhao,cangku,tel,address,zhidan,jinshou,shoukuan"
                    ",fahuo,kehuqianzi,No1,goods1,unit1,guige1,amount1,danjia1,money1,beizhu1,total)"
                    "values ({}".format("\'"+datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')+"\'")+",'黄小泽','2017151024','20','15768497448','广东',"
                    "'小红','小黄','小兰','小明','小倩','2017','牙膏','根','加工','8','12','96','没有','96.0')")
        
        query.exec_("insert into Kucun(date,name,bianhao) values('2018/11/26 5','黄泽文','2017151024')")
        """
        query.exec_(
            "SELECT            date,name,bianhao,cangku,tel,address,zhidan,jinshou,shoukuan"
            ",fahuo,kehuqianzi,No1,unit1,guige1,amount1,danjia1,beizhu1 FROM Kucun"
        )  # 4

        while query.next():
            print(query.value(0), query.value(1), query.value(2))

        query.exec_("insert into sh(number,name)" "values ('1023','不锈钢')")
        query.exec_("SELECT number, name FROM sh")  # 4
        while query.next():
            stu_name = query.value(0)
            stu_class = query.value(1)
            print(stu_name, stu_class)

    def SetTable(self, table):
        self.model.setTable(table)

    def sql_exec(self):
        self.model = QSqlTableModel()
        self.model.setTable('sh')
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.model.setHeaderData(0, Qt.Horizontal, "商品编号")
        self.model.setHeaderData(1, Qt.Horizontal, "商品名称")
        self.model.setHeaderData(2, Qt.Horizontal, "单位")
        self.model.select()
        self.setModel(self.model)

    def InsertData(self, number, name, unit):
        if number == "" or name == "" or unit == "":
            return
        self.model.insertRow(0)
        self.model.setData(self.model.index(0, 0), number)
        self.model.setData(self.model.index(0, 1), name)
        self.model.setData(self.model.index(0, 2), unit)
        self.model.submit()

    def Find(self, number):
        self.model.setFilter('number==' + number)
        self.model.select()
        if self.model.record(0).value("number") == None:
            return False
        return True

    def getData(self, number):
        if self.Find(number):
            record = self.model.record(0)
            l = [
                record.value("number"),
                record.value("name"),
                record.value("unit")
            ]
            return l
        else:
            return None

    def UpDate(self, number, type, data):
        dic = {"number": 0, "name": 1, "unit": 2}
        if self.Find(number):
            self.model.setData(self.model.index(0, dic[type]), data)
            return True
        return False
コード例 #9
0
class TablePage(QWidget):
    exportSignal = QtCore.pyqtSignal(object)

    def __init__(self, db, table_name, condition, crossTable=False):
        """当crossTable为False时,为单张表查看,可读可写,table_name为表名,condition为过滤条件
        当crossTable为True时,为同类型多张表查询,只可以读不可以写,table_name为表类型名,condition为过滤条件"""
        super(QWidget, self).__init__()
        self.exportSignal.connect(self.exportSlot)
        self.db = db
        if self.db.open():  # 开启数据库连接
            logging.info("db is open")
        else:
            logging.critical("db is not open!!!")
            err = self.db.lastError()
            logging.critical(err.text())
            logging.critical(QtSql.QSqlDatabase.drivers())
            logging.critical(QApplication.libraryPaths())
        self.__table_name = table_name
        self.__crossTable = crossTable
        self.__dm = DataManager()
        if crossTable:
            self.model = QSqlQueryModel(self)
            for section, value in enumerate(
                ['id'] + ExcelCheck.headers[table_name]):  # 设置表头为该类型表的表头,包括id
                self.model.setHeaderData(section, Qt.Horizontal, value)
            if condition == "":
                query = " union ".join([
                    f"select * from {t}"
                    for t in self.__dm.get_my_tables(table_name)
                ])
            else:
                query = " union ".join([
                    f"select * from {t} where {condition}"
                    for t in self.__dm.get_my_tables(table_name)
                ])
            print(query)
            try:
                self.model.setQuery(query, self.db)
            except Exception as e:
                logging.exception(e)
                QMessageBox.warning(self, "查询出错", str(e))
        else:
            self.model = QSqlTableModel(self, db=self.db)
            self.model.setTable(table_name)
            self.model.setFilter(condition)
            self.model.select()
        tableView = QTableView()
        tableView.setModel(self.model)
        layout = QGridLayout()
        layout.addWidget(tableView)
        self.setLayout(layout)

    def exportToExcel(self, filePath):
        # 填写表头list
        if self.__crossTable:
            header = ["id"] + ExcelCheck.headers[self.__table_name]  # 在前面加上id列
        else:
            header = self.__dm.get_column_names(table_name=self.__table_name)
        # 确定s_num集合
        s_num = set()
        for i, name in enumerate(header):
            if name in ["发票号码"]:  # 属于s_num的列
                s_num.add(i)
        # 填写表格内容二维数组
        content = [["" for c in range(self.model.columnCount())]
                   for r in range(self.model.rowCount())]
        for i in range(self.model.rowCount()):
            for j in range(self.model.columnCount()):
                content[i][j] = self.model.index(i, j).data()
        print(header)
        print(content)
        logging.info("正在启动子线程")
        # 设置成为守护主线程,主线程退出后子线程直接销毁不再执行子线程的代码
        threading.Thread(target=self.writeToExcelWork,
                         args=(filePath, header, content, s_num),
                         daemon=True).start()

    def writeToExcelWork(self, filePath, header, content, s_num):
        try:
            logging.info("子线程已启动,正在调用Easyexcel进行导出")
            pythoncom.CoInitialize()
            excel = Easyexcel(filepath=filePath, visible=False)
            logging.info("Easyexcel对象创建成功,正在写入")
            excel.set_sheet("Sheet1", header, content, s_num)
            logging.info("数据写入完成,正在关闭Easyexcel对象")
            excel.close()
            logging.info("Easyexcel已正常关闭")
            self.exportSignal.emit("文件已导出,路径为" + filePath)
        except Exception as e:
            logging.exception(e)
            self.exportSignal.emit(e)

    def exportSlot(self, info):
        if isinstance(info, str):
            QMessageBox.information(self, "文件已导出", info)
        elif isinstance(info, Exception):
            QMessageBox.warning(self, "文件导出出错", str(info))
コード例 #10
0
class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.folder_path = QDir.current().path()
        self.init_ui()

    def init_ui(self):
        """Initialize ui."""
        self.setupUi(self)
        self.move_to_center()
        self.init_table_view()

        icon = QIcon('subtitle_analyze_gui.ico')
        self.setWindowIcon(icon)
        movie = QMovie('processing.gif')
        self.label.setMovie(movie)
        movie.start()
        self.label.setVisible(False)

        self.tableView.resizeColumnsToContents()
        self.tableView.resizeRowsToContents()
        self.tableView.horizontalHeader().setSectionResizeMode(
            QHeaderView.ResizeToContents)

        self.actionOpen_Folder.triggered.connect(self.open_folder)
        self.actionSave_As.triggered.connect(self.save_result)
        self.actionExit.triggered.connect(self.close)
        self.refreshPushButton.released.connect(self.refresh)

    def init_table_view(self):
        """Initialize the table view"""
        if not create_connection():
            sys.exit(1)
        self.model = QSqlTableModel()
        initialize_model(self.model)
        self.tableView.setModel(self.model)
        self.tableView.setSortingEnabled(True)
        reflesh_model(self.model)

    def move_to_center(self):
        """Move windows to the center of the screen."""
        screen = QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move((screen.width() - size.width()) / 2,
                  (screen.height() - size.height()) / 2)

    def open_folder(self):
        """Set target folder."""
        self.folder_path = QFileDialog.getExistingDirectory(
            self, 'Open the folder', QDir.currentPath())
        if not self.folder_path:
            self.folder_path = QDir.current().path()

    def save_result(self):
        """Save analyze result."""
        filename = QFileDialog.getSaveFileName(
            self, 'Save analyze result',
            os.path.join(QDir.current().path(), 'result.csv'), 'File (*.csv)')
        with open(filename[0], 'w', encoding='utf-8') as file:
            row = self.model.rowCount()
            col = self.model.columnCount()
            for i in range(row):
                text = ''
                for j in range(col):
                    text += str(self.model.data(self.model.index(i, j))) + '\t'
                text += '\n'
                file.writelines(text)

    def analyze_subtitle(self):
        """Analyze subtitles"""
        filename_list = get_subtitle_filename_list(self.folder_path, mode='r')
        result_dict = single_thread_analyze(filename_list)
        for key in result_dict.keys():
            add_record(result_dict[key][0], result_dict[key][1],
                       result_dict[key][2] / 1000, result_dict[key][3])

    def refresh(self):
        """Execute analysis task."""
        self.label.setVisible(True)
        self.refreshPushButton.setEnabled(False)

        reflesh_model(self.model)
        self.task_thread = TaskThread()
        self.task_thread.set_task(self.analyze_subtitle)
        self.task_thread.finish_signal.connect(self.process_thread_message)
        self.task_thread.start()

    def process_thread_message(self, message):
        """Processing thread message."""
        reflesh_model(self.model)
        self.label.setVisible(False)
        self.refreshPushButton.setEnabled(True)
コード例 #11
0
class MainMenu(QMainWindow):
    def __init__(self, parent=None):
        super(MainMenu, self).__init__(parent)

        # -----------------  UI  --------------------------#
        loadUi("./UI/main_ui.ui", self)
        self.setWindowTitle("密码保险柜")
        self.setWindowIcon(QIcon("./image/1.ico"))

        # -----------------  按键  --------------------------#
        self.pushButtonExit.clicked.connect(QCoreApplication.instance().quit)
        self.pushButtonDel.clicked.connect(self.delete)
        self.pushButtonAdd.clicked.connect(self.add)
        self.refresh.clicked.connect(self.reselect)

        # -----------------  db  --------------------------#
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("./db/word.db")

        # -----------------  model  --------------------------#
        self.model = QSqlTableModel()
        self.model.setTable("warehouse")
        self.model.setSort(ID, Qt.AscendingOrder)
        self.model.setHeaderData(ID, Qt.Horizontal, "ID")
        self.model.setHeaderData(SITE, Qt.Horizontal, "站点")
        self.model.setHeaderData(NAME, Qt.Horizontal, "账号")
        self.model.setHeaderData(PASS, Qt.Horizontal, "密码")
        self.model.setHeaderData(REMARK, Qt.Horizontal, "备注")
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)

        # -----------------  tableView  --------------------------#
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)

        # -----------------  query  --------------------------#
        self.query = QSqlQuery()

    def contextMenuEvent(self, event):
        cmenu = QMenu()
        quitAct = cmenu.addAction("退出")
        action = cmenu.exec_(self.mapToGlobal(event.pos()))
        if action == quitAct:
            qApp.quit()

    def add(self):
        self.query.exec(
            "insert into `warehouse` VALUES (NULL ,'example.com','example','example','example')"
        )
        self.reselect()
        rows = self.model.rowCount()
        self.tableView.selectRow(rows)

    def delete(self):
        row = self.tableView.currentIndex().row()
        site_id = self.model.data(self.model.index(row, 0))
        sql = "delete from `warehouse` where id =" + str(site_id)
        self.query.exec(sql)
        self.reselect()

    def reselect(self):
        if self.model.data(self.model.index(self.model.rowCount(), 0)) != "":
            self.model.select()
コード例 #12
0
class ClerkDialog(QDialog, Ui_Dialog):
    def __init__(self, table, mainModel, parent=None):
        super(ClerkDialog, self).__init__(parent)
        self.setupUi(self)
        self.table = table
        self.mainModel = mainModel

        # 关联待写
        self.model = QSqlTableModel(self)
        self.model.setTable(table)
        self.model.setSort(ID, Qt.AscendingOrder)
        self.model.setHeaderData(ID, Qt.Horizontal, "Order")
        self.model.setHeaderData(NAME, Qt.Horizontal, "Name")
        self.model.setHeaderData(GENDER, Qt.Horizontal, "Gender")
        self.model.setHeaderData(DEPARTMENT, Qt.Horizontal, "Department")
        self.model.select()

        self.tableView.setModel(self.model)
        self.tableView.setSelectionMode(QTableView.SingleSelection)
        self.tableView.setSelectionBehavior(QTableView.SelectRows)
        self.tableView.setColumnHidden(ID, True)
        self.tableView.setColumnHidden(GENDER, True)
        self.tableView.setEditTriggers(
            QAbstractItemView.NoEditTriggers)  # 不允许编辑
        # self.tableView.verticalHeader(False)
        self.tableView.resizeColumnsToContents()
        items = []  # 获取所有部门名称
        query = QSqlQuery()
        query.exec("SELECT dpt_name FROM departments{0}".format(createmoth))
        while query.next():  # 找到第一条记录,每次后移一条记录
            items.append(query.value("dpt_name"))
        self.clerk_dpt_comboBox.addItems(items)

    @pyqtSlot()
    def on_clk_del_pb_clicked(self):
        """删除职员"""
        index = self.tableView.currentIndex()
        if not index.isValid():
            return
        self.model.removeRow(index.row())
        self.model.submitAll()
        self.model.select()
        self.mainModel.select()  # 同步更新

    @pyqtSlot()
    def on_clk_add_pb_clicked(self):
        """增加职员"""
        id = self.clk_seq_le.text()  # 获取id
        name = self.clk_name_le.text()  # 获取姓名
        dpt = self.clerk_dpt_comboBox.currentText()  # 获取部门
        query = QSqlQuery()  # 将名称转换成部门id
        query.exec(
            "SELECT dpt_id FROM departments{0} WHERE dpt_name='{1}'".format(
                createmoth, dpt))
        query.next()
        dpt_id = query.value(0)

        row = self.model.rowCount()  # 在最后一行加上去
        # row = self.tableView.currentIndex().row()   # 在所选取的行插入,在这里不可行,因为已经有排序策略
        self.model.database().transaction()
        self.model.insertRow(row)
        self.model.setData(self.model.index(row, ID), id)
        self.model.setData(self.model.index(row, NAME), name)
        self.model.setData(self.model.index(row, DEPARTMENT), dpt_id)
        self.model.submitAll()
        self.model.select()
        self.model.database().commit()
        self.mainModel.select()

    @pyqtSlot()
    def on_clk_modify_pb_clicked(self):
        """修改职员"""
        index = self.tableView.currentIndex()
        if not index.isValid():
            return
        self.clk_id = self.model.record(index.row()).value(ID)
        clk_name = self.model.record(index.row()).value(NAME)
        clk_dpt = self.model.record(index.row()).value(DEPARTMENT)

        from change_slot import ChangeDialog
        dialog = ChangeDialog(self.clk_id, clk_name, clk_dpt, self)
        dialog.okClickedSignal.connect(self.ok_slot)
        if dialog.exec():
            print("Done")

    def ok_slot(self, cid, name, dpt):
        QSqlDatabase.database().transaction()
        query = QSqlQuery()
        query.exec(
            "UPDATE clerks{0} SET clk_id='{1}',clk_name='{2}',dpt_id='{3}'"
            "WHERE clk_id='{4}'".format(createmoth, cid, name, dpt,
                                        self.clk_id))
        if 'Yes':
            QSqlDatabase.database().commit()
            self.model.select()
            self.mainModel.select()
        else:
            QSqlDatabase.database().rollback()

    @pyqtSlot()
    def on_clk_up_pb_clicked(self):
        """职员上移"""
        # 先避开
        pass

    @pyqtSlot()
    def on_clk_down_pb_clicked(self):
        """职员下移"""
        # 先避开
        pass

    @pyqtSlot()
    def on_clk_save_pb_clicked(self):
        """保存"""
        # 先避开
        pass

    @pyqtSlot()
    def on_clk_quit_pb_clicked(self):
        QDialog.done(self, 1)
コード例 #13
0
ファイル: winsWidgetView.py プロジェクト: winsomexiao/PyDemo
class WinsWidgetView(QWidget, Ui_Wins_Widget):

        def __init__(self,parent=None):
            logger.debug("_init__:begin")
            super(WinsWidgetView, self).__init__(parent)
            self.setupUi(self)
            self.dbPath="test.db"
            self.curTable="test2"

            self.setObjectName('winsWidget')
            self.setWindowFlags(Qt.FramelessWindowHint)
            self.setWindowTitle('wins的小工具')
            self.setWindowIcon(QIcon('icons/titleIcon.png'))

            self.tableModel=QSqlTableModel(self,QSqlDatabase.addDatabase('QSQLITE'))

            self.initThread()
            self.set_buttons()
            self.set_labels()
            self.set_lines()
            self.load_tableview()
            self.init_bottom()
            logger.debug("_init__:end")


        def init_bottom(self):
            self.progressBar.hide()
            self.progresslable.hide()
            self.statusBar= QStatusBar(self);
            self.rightBottom.addWidget(self.statusBar)
            #self.statusBar.setGeometry(30,40,200,25);


        def initThread(self):
            logger.debug("_init__:thread")
            self.thread=QThread()
            self.tsWork=TushareWorkObject()
            self.tsWork.moveToThread(self.thread) ##另起子线程,防止ui主线程卡死
            self.thread.start()
            #槽函数不要加(),否则会报参数异常
            self.tsWork.procegressBarSignal.connect(self.setProcegressBar)
            logger.debug("_init end__:thread")

        def setProcegressBar(self,i):
            print("setProcegressBar:")
            print(i)
            self.progressBar.show()
            self.progressBar.setRange(0, i)
            pass

        """重写鼠标事件,实现窗口拖动。"""
        def mousePressEvent(self, event):
            #logger.debug("mousePressEvent:")
            if event.buttons() == Qt.LeftButton:
                self.m_drag = True
                self.m_DragPosition = event.globalPos()-self.pos()
                event.accept()

        def mouseMoveEvent(self, event):
            #logger.debug("mouseMoveEvent:")
            try:
                if event.buttons() and Qt.LeftButton:
                    self.move(event.globalPos()-self.m_DragPosition)
                    event.accept()
            except AttributeError:
                pass

        def mouseReleaseEvent(self, event):
            #logger.debug("mouseReleaseEvent:")
            self.m_drag = False


 # 设置布局。
        def set_layouts(self):
            logger.debug("set_layouts:begin")
            self.page1group.setAlignment(Qt.AlignCenter)
            self.page1layout.setAlignment(Qt.AlignCenter)
            logger.debug("set_layouts:end")

# 设置按钮
        def set_buttons(self):
            logger.debug("set_buttons:begin")
            self.closeBtn.setText('×')
            self.closeBtn.clicked.connect(self.close)
            self.closeBtn.setToolTip('退出')
            # 最小化。
            self.minBtn.setText('-')
            self.minBtn.clicked.connect(self.showMinimized)
            self.minBtn.setToolTip('最小化')
            # 最大化。
            self.maxBtn.setText('□')
            self.maxBtn.setToolTip('^_^此功能已上火星')
            # 登陆。
            self.loginBtn.setText('')
            self.loginBtn.setToolTip('登陆')
            # 搜索输入框。
            self.searchInput.resize(48, 48)
            # 搜索按钮
            self.searchBtn.setText('')
            self.searchBtn.setToolTip('点击搜索')

            # 查询。
            self.qryBtn.setIcon(QIcon('icons/qryBtn.png'))
            self.qryBtn.setText("查询")
            self.qryBtn.clicked.connect(self.qryFunc)
            self.qryBtn.setAutoRaise(True)
            self.qryBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
            # 增加。
            self.addBtn.setIcon(QIcon('icons/addBtn.png'))
            self.addBtn.setText("增加")
            self.addBtn.clicked.connect(self.addFunc)
            self.addBtn.setAutoRaise(True)
            self.addBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
            # 删除。
            self.delBtn.setIcon(QIcon('icons/delBtn.png'))
            self.delBtn.setText("删除")
            self.delBtn.clicked.connect(self.delFunc)
            self.delBtn.setAutoRaise(True)
            self.delBtn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
            logger.debug("set_buttons:end")

            self.toolBox.setCurrentIndex(1)
            self.toolBox.setItemIcon(0,QIcon("icons/homeIcon.png"))
            self.toolBox.setItemIcon(1,QIcon("icons/homeIcon.png"))

            self.page1btn1.setIcon(QIcon("icons/homeIcon.png"))
            self.page1btn1.setText(self.tr("首页"))
            self.page1btn1.setIconSize(QSize(40,40))
            self.page1btn1.setAutoRaise(True)
            self.page1btn1.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

            self.page1btn2.setIcon(QIcon("icons/graphIcon.png"))
            self.page1btn2.setText(self.tr("图表"))
            self.page1btn2.setIconSize(QSize(40,40))
            self.page1btn2.setAutoRaise(True)
            self.page1btn2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

            self.page1btn3.setIcon(QIcon("icons/taskIcon.png"))
            self.page1btn3.setText(self.tr("任务"))
            self.page1btn3.setIconSize(QSize(40,40))
            self.page1btn3.setAutoRaise(True)
            self.page1btn3.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

            self.page1btn4.setIcon(QIcon("icons/clockIcon.png"))
            self.page1btn4.setText(self.tr("提醒"))
            self.page1btn4.setIconSize(QSize(40,40))
            self.page1btn4.setAutoRaise(True)
            self.page1btn4.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

            self.page1btn5.setIcon(QIcon("icons/favIcon.png"))
            self.page1btn5.setText(self.tr("收藏"))
            self.page1btn5.setIconSize(QSize(40,40))
            self.page1btn5.setAutoRaise(True)
            self.page1btn5.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

            self.page1btn6.setIcon(QIcon("icons/kxianIcon.png"))
            self.page1btn6.setText(self.tr("k线"))
            self.page1btn6.setIconSize(QSize(40,40))
            self.page1btn6.setAutoRaise(True)
            self.page1btn6.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)


            self.page2btn1.setIcon(QIcon("icons/marketIcon.png"))
            self.page2btn1.setText(self.tr("行情"))
            self.page2btn1.setIconSize(QSize(40,40))
            self.page2btn1.setAutoRaise(True)
            self.page2btn1.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
            logging.debug("self.page2btn1.clicked.connect(self.tsWork.findLimitupStocks)")
            self.page2btn1.clicked.connect(self.tsWork.findLimitupStocks)


            self.page2btn2.setIcon(QIcon("icons/stockIcon.png"))
            self.page2btn2.setText(self.tr("通联"))
            self.page2btn2.setIconSize(QSize(40,40))
            self.page2btn2.setAutoRaise(True)
            self.page2btn2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)


            self.page2btn3.setIcon(QIcon("icons/contactIcon.png"))
            self.page2btn3.setText(self.tr("货币供应"))
            self.page2btn3.setIconSize(QSize(40,40))
            self.page2btn3.setAutoRaise(True)
            self.page2btn3.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
            logging.debug("self.page2btn1.clicked.connect(self.tsWork.findLimitupStocks)")
            self.page2btn3.clicked.connect(self.tsWork.getMoneySupply)

            self.page2btn4.setIcon(QIcon("icons/calIcon.png"))
            self.page2btn4.setText(self.tr("绩效"))
            self.page2btn4.setIconSize(QSize(40,40))
            self.page2btn4.setAutoRaise(True)
            self.page2btn4.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

        def getLimitupStock_work(self):
            logging.debug("winview:begin getLimitupStock_work")
            tsWork=TushareWorkObject()
            tsWork.moveToThread(self.thread) ##另起子线程,防止ui主线程卡死

            self.limupStockThread.setRun(6)
            logging.debug("winview:begin beginRun")
            self.limupStockThread.outSignal.connect(self.limupStockThread_outfunc)

        def limupStockThread_outfunc(self,text):
            QMessageBox.about( self, "涨停板股票收集",text)
            print("limupStockThread_outfunc"+text)





        def set_labels(self):
            logger.debug("set_labels:begin")
            titlePix = QPixmap()
            titlePix.load('icons/titleIcon.png')
            self.headIcon.setPixmap(titlePix.scaled(40, 40))
            self.headTitle.setText("Wins百宝箱")
            self.topSpace.setText("")
            logger.debug("set_labels:end")

        def set_lines(self):
            logger.debug("set_lines:begin")
            self.searchInput.setPlaceholderText('搜索')
            logger.debug("set_lines:end")

        def load_tableview(self):
            logger.debug("load_tableview:begin")

             ###self.model数据初始化
            self.tableModel.database().setDatabaseName(self.dbPath)
            self.tableModel.database().open()
            self.tableModel.setTable(self.curTable)
            self.tableModel.select()

            self.tableModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
            # 数据更新的策略,详细可以查看Qt文档
            self.tableView.setModel(self.tableModel)
            self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
            self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection)

            logger.debug("load_tableview:end")

    #查询按钮关联的槽函数
        def qryFunc(self):
            #self.db.execSQL("select * from t1")
            QMessageBox.about( self, 'qryFuncCall', "qryFunc")

    #插入按钮关联的槽函数
        def addFunc(self):
            f1=random.randint(1, 99)
            self.tableModel.insertRows(0, 1)
            self.tableModel.setData(self.tableModel.index(0, 0), f1)
            self.tableModel.setData(self.tableModel.index(0, 1), "test")
            self.tableModel.submitAll()
            QMessageBox.about( self, 'addFuncCall', "addFunc")


        def delFunc(self):
                 rs=list(map(lambda x:x.row(),self.tableView.selectedIndexes()))
                 if len(rs)==0:
                     QMessageBox.information(self,'提醒','请先选中至少一行,再点击此按钮!')
                     return
                 for i in reversed(rs):
                     self.tableModel.removeRows(i,1)
                 self.tableModel.submitAll()
コード例 #14
0
class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()  # 初始化,super集成父类的属性
        self.ui = PreviewApp.Ui_MainWindow()  # 实例化
        self.ui.setupUi(self)
        self.setWindowIcon(QIcon('db/logo.jpg'))
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('db/App.db')
        self.db.open()

        self.tableView = self.ui.tableView  # 获取TableView对象
        self.tableView1 = self.ui.tableView1

        self.model = QSqlTableModel(self)  # 设置数据库模型
        self.model.setTable("Preview")  # 选择db的其中一个表
        self.tableView.setModel(self.model)  # 设置TableView的模型
        self.tableView.setEditTriggers(QTableView.NoEditTriggers)  # 设置表1内容不可编辑
        self.model.select()
        # model1为页面2对象
        self.model1 = QSqlTableModel(self)
        self.model1.setTable("Container")
        self.tableView1.setModel(self.model1)
        self.model1.select()

        self.ui.btn1.clicked.connect(self.addRow)
        self.ui.btn2.clicked.connect(self.delRow)
        self.ui.btn3.clicked.connect(self.CPU)
        self.ui.btn4.clicked.connect(self.Memory)
        self.ui.btn5.clicked.connect(self.CPU_temp)
        self.ip_list = []
        self.tcpserver = TcpServer(self)
        self.tcpserver.listen(QHostAddress("0,0,0,0,"), Port)  # 绑定监听端口
        self.tcpserver.signRecv.connect(self.Recv)
        #     self.tcpserver.signGetAddress.connect(self.updateCombox)
        self.updateCombox()

    def updateCombox(self):
        if self.db.open():
            print("open")  # 打开了数据库
            query1 = QSqlQuery()
            query1.exec_("SELECT adress FROM IP")  #打开查询数据库表
        for i in range(query1.size()):
            print(query1.value(0))
            self.ui.comboBox1.addItem(query1.value(0))  # 添加下拉列表框事件
            query1.next()

    def Recv(self, msg):
        reply = QMessageBox.information(self, "标题", msg,
                                        QMessageBox.Yes | QMessageBox.No)

    def Send(self, msg):  # 调用接口函数,向客户端发送消息
        print('发送信号发出')
        for id in self.tcpserver.socketList:
            self.tcpserver.signSend.emit(msg, id)

    def addRow(self):  # 添加一行
        row = self.model1.rowCount()
        self.model1.insertRow(row)
        index = self.model1.index(row, CONTAINER)
        self.tableView1.setCurrentIndex(index)
        self.tableView1.edit(index)

    def delRow(self):
        index = self.tableView1.currentIndex()
        if not index.isValid():
            return
        record = self.model1.record(index.row())
        container = record.value(CONTAINER)
        state = record.value(STATE)
        if (QMessageBox.question(
                self,
                "Container Data",  # 删容器时弹框
            ("Delete this record?".format(state, container)),
                QMessageBox.Yes | QMessageBox.No) == QMessageBox.No):
            return
        self.model1.removeRow(index.row())
        self.model1.submitAll()
        self.model1.select()

    def CPU(self):  # CPU占有率曲线
        self.ui.label2.setPixmap(QPixmap("db/CPU_percent.png"))

    def Memory(self):  # 内存曲线
        self.ui.label2.setPixmap(QPixmap("db/memory.jpg"))

    def CPU_temp(self):  # CPU温度
        self.ui.label2.setPixmap(QPixmap("db/CPU.jpg"))
コード例 #15
0
class ReferenceDataDlg(QDialog):
    def __init__(self, parent=None):
        super(ReferenceDataDlg, self).__init__(parent)

        self.model = QSqlTableModel(self)
        self.model.setTable("reference")
        self.model.setSort(ID, Qt.AscendingOrder)
        self.model.setHeaderData(ID, Qt.Horizontal, "ID")
        self.model.setHeaderData(NAME, Qt.Horizontal, "NAME")
        self.model.setHeaderData(Description, Qt.Horizontal, "Description")
        self.model.setHeaderData(AGE, Qt.Horizontal, "AGE")
        self.model.select()

        self.view = QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionMode(QTableView.SingleSelection)
        self.view.setSelectionBehavior(QTableView.SelectRows)
        self.view.setColumnHidden(ID, True)
        self.view.resizeColumnsToContents()

        buttonBox = QDialogButtonBox()
        addButton = buttonBox.addButton("&Add", QDialogButtonBox.ActionRole)
        deleteButton = buttonBox.addButton("&Delete",
                                           QDialogButtonBox.ActionRole)
        sortButton = buttonBox.addButton("&Sort", QDialogButtonBox.ActionRole)
        if not MAC:
            addButton.setFocusPolicy(Qt.NoFocus)
            deleteButton.setFocusPolicy(Qt.NoFocus)
            sortButton.setFocusPolicy(Qt.NoFocus)

        menu = QMenu(self)
        sortByNAMEAction = menu.addAction("Sort by &NAME")
        sortByDescriptionAction = menu.addAction("Sort by &Description")
        sortByIDAction = menu.addAction("Sort by &ID")
        sortButton.setMenu(menu)
        closeButton = buttonBox.addButton(QDialogButtonBox.Close)

        layout = QVBoxLayout()
        layout.addWidget(self.view)
        layout.addWidget(buttonBox)
        self.setLayout(layout)

        addButton.clicked.connect(self.addRecord)
        deleteButton.clicked.connect(self.deleteRecord)
        sortByNAMEAction.triggered.connect(lambda: self.sort(NAME))
        sortByDescriptionAction.triggered.connect(
            lambda: self.sort(Description))
        sortByIDAction.triggered.connect(lambda: self.sort(ID))
        closeButton.clicked.connect(self.accept)
        self.setWindowTitle("数据库小程序")

    def addRecord(self):
        row = self.model.rowCount()
        self.model.insertRow(row)
        index = self.model.index(row, NAME)
        self.view.setCurrentIndex(index)
        self.view.edit(index)

    def deleteRecord(self):
        index = self.view.currentIndex()
        if not index.isValid():
            return
        record = self.model.record(index.row())
        NAME = record.value(NAME)
        desc = record.value(Description)
        if (QMessageBox.question(
                self, "数据库小程序",
            ("Delete {0} from NAME {1}?".format(desc, NAME)),
                QMessageBox.Yes | QMessageBox.No) == QMessageBox.No):
            return
        self.model.removeRow(index.row())
        self.model.submitAll()
        self.model.select()

    def sort(self, column):
        self.model.setSort(column, Qt.AscendingOrder)
        self.model.select()
コード例 #16
0
class TableToTreeModel2 (QAbstractItemModel):
    """
    Более новый вариант - используем композицию, то есть абстрактная модель
    включает в себя sql табличную модель только для работы с базой данных
    """

    def __init__(self, m, connection):
        QAbstractItemModel.__init__(self, m)

        # попробуем сделать композицию
        self.dbmodel = QSqlTableModel(self, connection)
        self.dbmodel.setEditStrategy(0) # при каждом изменении поля
        #print (self.dbmodel.hasIndex(1,12))


        self.headers=['id',
                      '_buy',
                      'deadline',
                      'made',
                      'significance',
                      'urgency',
                      '_children',
                      '_next',
                      '_parents',
                      '_prev',
                      'season',
                      'short text',
                      'tags',
                      'text']

        self.rootItem = TreeItem (self.headers)

    def setTable(self, tname):
        self.dbmodel.setTable(tname)

    def select(self):
        self.dbmodel.select()
        #здесь должны грузиться данные


        dct = dict () #словарь айди - список строк с данными

        for ind in range (self.dbmodel.rowCount()):
            #dct[int(self.dbmodel.data(self.dbmodel.index(ind,0)))] = [self.dbmodel.data(self.dbmodel.index(ind,j)) for j in range(self.dbmodel.columnCount())]
            dct[int(self.dbmodel.data(self.dbmodel.index(ind,0)))] = [self.dbmodel.data(self.dbmodel.index(ind,j)) for j in range(self.dbmodel.columnCount())]


        def find_children_and_append (item:TreeItem, dct):
            chlist = eval(item.data(6))
            for ch in chlist:
                tri = TreeItem(dct[ch], item)
                if tri.data(6) != '[]':
                    find_children_and_append(tri,dct)
                item.appendChild(tri)



        for i in [j for j in dct.values() if j[8]=='[]']:
            tri = TreeItem(i, self.rootItem)
            find_children_and_append(tri,dct)
            self.rootItem.appendChild(tri)




    def columnCount(self, QModelIndex_parent=None, *args, **kwargs):
        return self.dbmodel.columnCount()

    def data(self, index, role):
        if not index.isValid():
            return None
        if role != Qt.DisplayRole:
            return None
        item = index.internalPointer()
        return item.data(index.column())

    def flags(self, index):
        if not index.isValid():
            return Qt.NoItemFlags
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable |Qt.ItemIsEditable

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.headers[section]
            #return self.dbmodel.headerData(section,orientation,role)


    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()
        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()
        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QModelIndex()

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0
        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()
        return parentItem.childCount()

    def parent(self, index):
        if not index.isValid():
            return QModelIndex()
        childItem = index.internalPointer()
        parentItem = childItem.parent()
        if parentItem == self.rootItem:
            return QModelIndex()
        return self.createIndex(parentItem.row(), 0, parentItem)


    def getIndexById(self, _id):
        for i in range (self.dbmodel.rowCount()):
            if int (self.dbmodel.data(self.dbmodel.index(i,0)))==_id:
                return self.dbmodel.index(i,0)
        return QModelIndex()

    def setData(self, modelIndex, value, int_role=Qt.EditRole):
        """
        Функция вызывается при установке данных
        :param QModelIndex:
        :param QVariant:
        :param int_role:
        :return:
        """

        print (self.dbmodel.record(0).setValue(12, 'sdfsfsdf'))

        r = self.dbmodel.record(1)

        r.setValue(12, 'Krevedko')
        print (self.dbmodel.setRecord(0,r))


        print (r)




        return 1
コード例 #17
0
ファイル: MainWindowView.py プロジェクト: winsomexiao/PyDemo
class MyMainWindowView(QMainWindow, Ui_myMainWindow):
    # 增加自定义信号
    _selfSignal = QtCore.pyqtSignal(str)


    def __init__(self):
        super(MyMainWindowView, self).__init__()
        self.setupUi(self)
        self._selfSignal.connect(self.allBtnShow)
        self.actionAbout.triggered.connect(self.aboutFun)
        self.actionExit.triggered.connect(QApplication.instance().quit)
        self.actionChange_title.triggered.connect(self.changeTitle)

        self.qryBtn.clicked.connect(self.qryFunc)
        self.addBtn.clicked.connect(self.addFunc)
        self.delBtn.clicked.connect(self.delFunc)
        self.del2Btn.clicked.connect(self.del2Func)
        self.db=DBConn()
        #model 与 view绑定
        self.myTableModel=QSqlTableModel(self)
        self.myTableModel.setTable("t1")
        self.myTableModel.select()
        self.myTableModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
        # 数据更新的策略,详细可以查看Qt文档
        self.myTableView.setModel(self.myTableModel)
        self.myTableView.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.myTableView.setSelectionMode(QAbstractItemView.ExtendedSelection)

# 增加自定义槽函数
    def allBtnHide(self):
        print("test2")
        self.pushButton.hide()
        self.pushButton_2.hide()
        time.sleep(1)
        self._selfSignal.emit("我是自定义信号")
        # self.pushButton_3.hide()


#增加自定义槽函数
    def allBtnShow(self, signalstr):
        self.pushButton.show()
        self.pushButton_2.show()
        self.pushButton_3.setText(signalstr)

# 增加自定义槽函数
    def aboutFun(self):
           QMessageBox.about( self, 'PyQt', "About")

    def changeTitle(self):
          self.setWindowTitle("xxx Window")

#查询按钮关联的槽函数
    def qryFunc(self):
        #self.db.execSQL("select * from t1")
        QMessageBox.about( self, 'qryFuncCall', "qryFunc")

#插入按钮关联的槽函数
    def addFunc(self):
        # f1=random.randint(1, 9999)
        # sql  = "insert into t1(f1,f2) values (%s,%s)"%(f1,f1)
        # self.db.execSQL(sql)
        f1=random.randint(1, 99)
        self.myTableModel.insertRows(0, 1)
        self.myTableModel.setData(self.myTableModel.index(0, 0), f1)
        self.myTableModel.setData(self.myTableModel.index(0, 1), "test")
        self.myTableModel.submitAll()
        QMessageBox.about( self, 'addFuncCall', "addFunc")

    # #删除按钮关联的槽函数
    def del2Func(self):
         if self.myTableModel.select() :
            if self.myTableModel.rowCount() != 0:
                for i in self.myTableView.selectedIndexes():
                    self.myTableModel.removeRows(i.row(), 1)
                self.myTableModel.submitAll()

# #删除按钮关联的槽函数
#     def delFunc(self):
#         if self.myTableModel.select() :
#            if self.myTableModel.rowCount() != 0:
#                index = self.myTableView.currentIndex()
#                self.myTableModel.removeRows(0,1)
#                self.myTableModel.submitAll()
#         QMessageBox.about( self, 'delFuncCall', "delFunc")



    def delFunc(self):
             rs=list(map(lambda x:x.row(),self.myTableView.selectedIndexes()))
             if len(rs)==0:
                 QMessageBox.information(self,'提醒','请先选中至少一行,再点击此按钮!')
                 return
             for i in reversed(rs):
                 self.myTableModel.removeRows(i,1)
             self.myTableModel.submitAll()
コード例 #18
0
class DatabaseTableView(QTableView):
    """customized table view"""
    TABLE = ''

    def __init__(self, db, parent=None):
        super().__init__(parent)
        self.db = db
        self._init_model()
        self._init_context_menu()

    def _init_model(self):
        self.model = QSqlTableModel(db=self.db)
        self.model.setTable(self.TABLE)
        self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.setModel(self.model)
        self.model.select()

    def _init_context_menu(self):
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self._context_menu = QMenu(self)
        self.customContextMenuRequested.connect(self._on_context_menu)
        self._add_row_action = QAction("添加行", self)
        self._del_row_action = QAction("删除行", self)
        self._submit_action = QAction("提交修改", self)
        self._modify_filter_action = QAction("筛选", self)
        self._update_action = QAction("刷新", self)
        self._show_detail_action = QAction("详情", self)

        self._context_menu.addAction(self._add_row_action)
        self._context_menu.addAction(self._del_row_action)
        self._context_menu.addAction(self._submit_action)
        self._context_menu.addAction(self._modify_filter_action)
        self._context_menu.addAction(self._update_action)
        self._context_menu.addAction(self._show_detail_action)

    def _on_context_menu(self, pos):
        action = self._context_menu.exec_(self.viewport().mapToGlobal(pos))
        if action == self._add_row_action:
            self.model.insertRows(self.model.rowCount(), 1)
        elif action == self._del_row_action:
            self.model.removeRow(self.currentIndex().row())
        elif action == self._submit_action:
            res = self.model.submitAll()
            if not res:
                QMessageBox.warning(self, "Sql Error",
                                    self.model.lastError().text())
        elif action == self._modify_filter_action:
            self._modify_filter()
        elif action == self._update_action:
            self._update_model()
        elif action == self._show_detail_action:
            self._show_detail()

    def _modify_filter(self):
        filter_cmd = self.model.filter()
        new_filter, succ = QInputDialog.getText(self,
                                                "过滤",
                                                "过滤表达式",
                                                text=filter_cmd)
        if succ:
            self.model.setFilter(new_filter)
            self.model.select()

    def _show_detail(self):
        row = self.currentIndex().row()
        idn = self.model.index(row, 0).data()
        if idn is None:
            return
        self._get_detail(idn).show()

    def _get_detail(self, idn):
        raise NotImplementedError()

    def _update_model(self):
        self.model.select()
コード例 #19
0
ファイル: 数据库模型.py プロジェクト: awngas/pyqt_study
class ReferenceDataDlg(QDialog):
    def __init__(self, table, title, parent=None):
        super(ReferenceDataDlg, self).__init__(parent)

        self.model = QSqlTableModel(self)
        self.model.setTable(table)
        self.model.setSort(NAME, Qt.AscendingOrder)
        self.model.setHeaderData(ID, Qt.Horizontal, "ID")
        self.model.setHeaderData(NAME, Qt.Horizontal, "Name")
        self.model.setHeaderData(DESCRIPTION, Qt.Horizontal, "Description")
        self.model.select()

        self.view = QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionMode(QTableView.SingleSelection)
        self.view.setSelectionBehavior(QTableView.SelectRows)
        self.view.setColumnHidden(ID, True)
        self.view.resizeColumnsToContents()
        addButton = QPushButton("&Add")
        deleteButton = QPushButton("&Delete")
        okButton = QPushButton("&OK")
        if not MAC:
            addButton.setFocusPolicy(Qt.NoFocus)
            deleteButton.setFocusPolicy(Qt.NoFocus)

        buttonLayout = QHBoxLayout()
        buttonLayout.addWidget(addButton)
        buttonLayout.addWidget(deleteButton)
        buttonLayout.addStretch()
        buttonLayout.addWidget(okButton)
        layout = QVBoxLayout()
        layout.addWidget(self.view)
        layout.addLayout(buttonLayout)
        self.setLayout(layout)

        addButton.clicked.connect(self.addRecord)
        deleteButton.clicked.connect(self.deleteRecord)
        okButton.clicked.connect(self.accept)

        self.setWindowTitle(
            "Asset Manager - Edit {0} Reference Data".format(title))

    def addRecord(self):
        row = self.model.rowCount()
        self.model.insertRow(row)
        index = self.model.index(row, NAME)
        self.view.setCurrentIndex(index)
        self.view.edit(index)

    def deleteRecord(self):
        index = self.view.currentIndex()
        if not index.isValid():
            return
        #QSqlDatabase.database().transaction()
        record = self.model.record(index.row())
        id = record.value(ID)
        table = self.model.tableName()
        query = QSqlQuery()
        if table == "actions":
            query.exec_("SELECT COUNT(*) FROM logs "
                        "WHERE actionid = {0}".format(id))
        elif table == "categories":
            query.exec_("SELECT COUNT(*) FROM assets "
                        "WHERE categoryid = {0}".format(id))
        count = 0
        if query.next():
            count = query.value(0)
        if count:
            QMessageBox.information(
                self, "Delete {0}".format(table),
                ("Cannot delete {0}<br>"
                 "from the {1} table because it is used by "
                 "{2} records").format(record.value(NAME), table, count))
            #QSqlDatabase.database().rollback()
            return
        self.model.removeRow(index.row())
        self.model.submitAll()
        self.model.select()
コード例 #20
0
class WarehouseController(QObject):
    def __init__(self, list, table, addButton, editButton, deleteButton, dbase):
        super().__init__()
        self.list = list
        self.table = table
        self.addButton = addButton
        self.editButton = editButton
        self.deleteButton = deleteButton
        self.dbase = dbase

        self.shopModel = QSqlTableModel(db = dbase)
        self.shopModel.setTable("shop")
        self.shopModel.select()
        self.list.setModel(ComplexListModel(self.shopModel, "{name}"))
        self.list.selectionModel().currentChanged.connect(self.listSelectionChanged)

        self._checkPrivileges()

        if self.only_select:
            self.addButton.setEnabled(False)
            self.deleteButton.setEnabled(False)

        self.addButton.clicked.connect(self.addButtonClicked)
        self.editButton.clicked.connect(self.editButtonClicked)
        self.deleteButton.clicked.connect(self.deleteButtonClicked)

    def _checkPrivileges(self):
        query = QSqlQuery("SHOW GRANTS")
        only_select = None
        table_pattern = "`{}`".format("shop_detail").lower()
        while query.next():
            s = query.value(0).lower()
            if table_pattern in s:
                if "select" in s and only_select is None:
                    only_select = True
                else:
                    only_select = False
        self.only_select = bool(only_select)

    def listSelectionChanged(self, cur, prev):
        if not cur.isValid():
            return self.table.setModel(None)
        else:
            self.setShopIndex(cur.row())

    def setShopIndex(self, row):
        record = self.shopModel.record(row)
        self.detailModel = QSqlQueryModel()
        query = "SELECT detail.id as id, CONCAT(detail.article, \": \", detail.name) as dtl, shop_detail.quantity as qnt \
            FROM shop_detail INNER JOIN detail \
            ON shop_detail.detail_id = detail.id \
            WHERE shop_detail.shop_id={} ORDER BY dtl".format(record.value("id"))
        self.detailModel.setQuery(query)
        self.detailModel.setHeaderData(1, Qt.Horizontal, "Наименование")
        self.detailModel.setHeaderData(2, Qt.Horizontal, "Количество")
        self.table.setModel(self.detailModel)
        self.table.hideColumn(0)
        self.table.resizeColumnsToContents()
        self.table.selectionModel().currentChanged.connect(self.tableSelectionChanged)
        if not self.detailModel.query().isActive():
            print(self.detailModel.lastError().text())
        self.deleteButton.setEnabled(False)
        self.editButton.setEnabled(False)

    def tableSelectionChanged(self, cur, prev):
        if self.only_select: return
        if cur.isValid():
            self.deleteButton.setEnabled(True)
            self.editButton.setEnabled(True)
        else:
            self.deleteButton.setEnabled(False)
            self.editButton.setEnabled(False)
        self.addButton.setEnabled(True)

    def addButtonClicked(self):
        shop = self.shopModel.record(self.list.currentIndex().row())
        query = QSqlQuery("SELECT detail.id as id, CONCAT(detail.article, \": \", detail.name) as name \
            FROM detail WHERE NOT(detail.id IN (SELECT detail_id FROM shop_detail \
                WHERE shop_id={}))".format(shop.value("id")))
        details = {}
        while query.next():
            details[query.value("name")] = query.value("id")
        if not details:
            return QMessageBox.warning(None, "Ошибка добавления",
                "Не удалось добавить новый товар на склад: все возможные товары уже добавлены.")
        choice, ok = QInputDialog.getItem(None, "Товар", "Укажите товар:",
            list(details.keys()), 0, False)
        if not ok: return
        qnt, ok = QInputDialog.getInt(None, "Количество", "Укажите количество товара:",
            1, 1)
        if not ok: return
        detail_id = details[choice]
        shop_id = shop.value("id")
        query = QSqlQuery("INSERT INTO shop_detail (shop_id, detail_id, quantity) \
            VALUES ({}, {}, {})".format(shop_id, detail_id, qnt))
        if not query.isActive():
            print(query.lastError().text())
        self.setShopIndex(self.list.currentIndex().row())
        self.table.selectionModel().clearSelection()

    def editButtonClicked(self):
        detail = self.detailModel.record(self.table.currentIndex().row())
        qnt, ok = QInputDialog.getInt(None, "Количество", "Укажите количество товара:",
            detail.value("qnt"), 0)
        if not ok: return
        shop = self.shopModel.record(self.list.currentIndex().row())
        if qnt > 0:
            query = QSqlQuery("UPDATE shop_detail SET quantity={} \
                WHERE shop_id={} AND detail_id={}".format(qnt,
                    shop.value("id"), detail.value("id")))
        else:
            query = QSqlQuery("DELETE FROM shop_detail WHERE \
                shop_id={} AND detail_id={} LIMIT 1".format(
                    shop.value("id"), detail.value("id")))
        if not query.isActive():
            print(query.lastError().text())
        self.setShopIndex(self.list.currentIndex().row())

    def deleteButtonClicked(self):
        if not self.table.currentIndex().isValid(): return
        detail = self.detailModel.record(self.table.currentIndex().row())
        shop = self.shopModel.record(self.list.currentIndex().row())
        query = QSqlQuery("DELETE FROM shop_detail WHERE \
            shop_id={} AND detail_id={} LIMIT 1".format(
                shop.value("id"), detail.value("id")))
        if not query.isActive():
            print(query.lastError().text())
        self.setShopIndex(self.list.currentIndex().row())

    def update(self):
        cur = self.list.currentIndex()
        if cur.isValid():
            row = cur.row()
        else:
            row = 0
        self.shopModel.select()
        self.list.reset()
        self.selectRow(row)

    def selectRow(self, row):
        self.list.selectionModel().clearSelection()
        self.list.selectionModel().setCurrentIndex(
            self.shopModel.index(row, 0), QItemSelectionModel.Select)
コード例 #21
0
class TableToTreeModel2(QAbstractItemModel):
    """
    Более новый вариант - используем композицию, то есть абстрактная модель
    включает в себя sql табличную модель только для работы с базой данных
    """
    def __init__(self, m, connection):
        QAbstractItemModel.__init__(self, m)

        # попробуем сделать композицию
        self.dbmodel = QSqlTableModel(self, connection)
        self.dbmodel.setEditStrategy(0)  # при каждом изменении поля
        #print (self.dbmodel.hasIndex(1,12))

        self.headers = [
            'id', '_buy', 'deadline', 'made', 'significance', 'urgency',
            '_children', '_next', '_parents', '_prev', 'season', 'short text',
            'tags', 'text'
        ]

        self.rootItem = TreeItem(self.headers)

    def setTable(self, tname):
        self.dbmodel.setTable(tname)

    def select(self):
        self.dbmodel.select()
        #здесь должны грузиться данные

        dct = dict()  #словарь айди - список строк с данными

        for ind in range(self.dbmodel.rowCount()):
            #dct[int(self.dbmodel.data(self.dbmodel.index(ind,0)))] = [self.dbmodel.data(self.dbmodel.index(ind,j)) for j in range(self.dbmodel.columnCount())]
            dct[int(self.dbmodel.data(self.dbmodel.index(ind, 0)))] = [
                self.dbmodel.data(self.dbmodel.index(ind, j))
                for j in range(self.dbmodel.columnCount())
            ]

        def find_children_and_append(item: TreeItem, dct):
            chlist = eval(item.data(6))
            for ch in chlist:
                tri = TreeItem(dct[ch], item)
                if tri.data(6) != '[]':
                    find_children_and_append(tri, dct)
                item.appendChild(tri)

        for i in [j for j in dct.values() if j[8] == '[]']:
            tri = TreeItem(i, self.rootItem)
            find_children_and_append(tri, dct)
            self.rootItem.appendChild(tri)

    def columnCount(self, QModelIndex_parent=None, *args, **kwargs):
        return self.dbmodel.columnCount()

    def data(self, index, role):
        if not index.isValid():
            return None
        if role != Qt.DisplayRole:
            return None
        item = index.internalPointer()
        return item.data(index.column())

    def flags(self, index):
        if not index.isValid():
            return Qt.NoItemFlags
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable

    def headerData(self, section, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.headers[section]
            #return self.dbmodel.headerData(section,orientation,role)

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()
        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()
        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QModelIndex()

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0
        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()
        return parentItem.childCount()

    def parent(self, index):
        if not index.isValid():
            return QModelIndex()
        childItem = index.internalPointer()
        parentItem = childItem.parent()
        if parentItem == self.rootItem:
            return QModelIndex()
        return self.createIndex(parentItem.row(), 0, parentItem)

    def getIndexById(self, _id):
        for i in range(self.dbmodel.rowCount()):
            if int(self.dbmodel.data(self.dbmodel.index(i, 0))) == _id:
                return self.dbmodel.index(i, 0)
        return QModelIndex()

    def setData(self, modelIndex, value, int_role=Qt.EditRole):
        """
        Функция вызывается при установке данных
        :param QModelIndex:
        :param QVariant:
        :param int_role:
        :return:
        """

        print(self.dbmodel.record(0).setValue(12, 'sdfsfsdf'))

        r = self.dbmodel.record(1)

        r.setValue(12, 'Krevedko')
        print(self.dbmodel.setRecord(0, r))

        print(r)

        return 1
コード例 #22
0
class ReferenceDataDlg(QDialog):
    def __init__(self, parent=None):
        super(ReferenceDataDlg, self).__init__(parent)

        self.model = QSqlTableModel(self)
        self.model.setTable("reference")
        self.model.setSort(ID, Qt.AscendingOrder)
        self.model.setHeaderData(ID, Qt.Horizontal, "ID")
        self.model.setHeaderData(CATEGORY, Qt.Horizontal, "小车编号")
        self.model.setHeaderData(SHORTDESC, Qt.Horizontal, "检查记录")
        self.model.setHeaderData(LONGDESC, Qt.Horizontal, "巡检日期")
        self.model.select()

        self.view = QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionMode(QTableView.SingleSelection)
        self.view.setSelectionBehavior(QTableView.SelectRows)
        self.view.setColumnHidden(ID, True)
        self.view.resizeColumnsToContents()

        buttonBox = QDialogButtonBox()
        addButton = buttonBox.addButton("&添加", QDialogButtonBox.ActionRole)
        deleteButton = buttonBox.addButton("&删除", QDialogButtonBox.ActionRole)
        sortButton = buttonBox.addButton("&排序", QDialogButtonBox.ActionRole)
        if not MAC:
            addButton.setFocusPolicy(Qt.NoFocus)
            deleteButton.setFocusPolicy(Qt.NoFocus)
            sortButton.setFocusPolicy(Qt.NoFocus)

        menu = QMenu(self)
        sortByCategoryAction = menu.addAction("按小车编号排序")
        sortByDescriptionAction = menu.addAction("按检查记录排序")
        sortByIDAction = menu.addAction("按编号顺序排序")
        sortButton.setMenu(menu)
        closeButton = buttonBox.addButton(QDialogButtonBox.Close)

        layout = QVBoxLayout()
        layout.addWidget(self.view)
        layout.addWidget(buttonBox)
        self.setLayout(layout)

        addButton.clicked.connect(self.addRecord)
        deleteButton.clicked.connect(self.deleteRecord)
        sortByCategoryAction.triggered.connect(lambda: self.sort(CATEGORY))
        sortByDescriptionAction.triggered.connect(lambda: self.sort(SHORTDESC))
        sortByIDAction.triggered.connect(lambda: self.sort(ID))
        closeButton.clicked.connect(self.accept)
        self.setWindowTitle("巡检历史数据")
        self.setWindowIcon(
            QtGui.QIcon('icon/update_128px_1156069_easyicon.net.ico'))

    def addRecord(self):
        row = self.model.rowCount()
        self.model.insertRow(row)
        index = self.model.index(row, CATEGORY)
        self.view.setCurrentIndex(index)
        self.view.edit(index)

    def deleteRecord(self):
        index = self.view.currentIndex()
        if not index.isValid():
            return
        record = self.model.record(index.row())
        category = record.value(CATEGORY)
        desc = record.value(SHORTDESC)
        if (QMessageBox.question(self, "Reference Data",
                                 ("确定删除 {1} 的数据?".format(desc, category)),
                                 QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.No):
            return
        self.model.removeRow(index.row())
        self.model.submitAll()
        self.model.select()

    def sort(self, column):
        self.model.setSort(column, Qt.AscendingOrder)
        self.model.select()
コード例 #23
0
class QmyMainWindow(QMainWindow):
    def __init__(self, parent=None, dbFilename='None'):
        super().__init__(parent)  # Call the parent class. Create window.
        self.ui = Ui_MainWindow()  # Create UI object
        self.ui.setupUi(self)  # Create UI interface

        self.ui.tabWidget.setVisible(True)
        self.setCentralWidget(self.ui.tabWidget)

        # tableView setting
        self.ui.tableView.setSelectionBehavior(QAbstractItemView.SelectItems)
        self.ui.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
        self.ui.tableView.setAlternatingRowColors(True)
        self.ui.tableView.verticalHeader().setDefaultSectionSize(44)
        self.ui.tableView.horizontalHeader().setDefaultSectionSize(70)
        self.ui.tableView.setSortingEnabled(True)

        # Initialize chart
        self.__iniPieChart()  # Initialize pie chart
        self.__iniStackedBar()  # Stacked bar

        mpl.rcParams['font.sans-serif'] = ['Calibri']
        mpl.rcParams['font.size'] = 8

        # Choose the SQLITE database drive
        self.DB = QSqlDatabase.addDatabase("QSQLITE")
        self.DB.setDatabaseName(dbFilename)  # Set the name of database
        if self.DB.open():  # Open database
            self.__openTable()  # Open tables
        else:
            QMessageBox.warning(self, "Warning",
                                "Failed to open the database.")

# ==============Self-defined Fuctions============

    def __getFieldNames(self):  # Get names of all fields.
        # Get empty records, only field name.
        emptyRec = self.tabModel.record()
        self.fldNum = {}  # Dictionary of field name and index.
        for i in range(emptyRec.count()):
            fieldName = emptyRec.fieldName(i)
            self.fldNum.setdefault(fieldName)
            self.fldNum[fieldName] = i

    def __openTable(self):  # Open the table of database
        self.tabModel = QSqlTableModel(self, self.DB)  # Data model
        # Set the table of database TODO: Can user insert their own tables from
        # the database?
        self.tabModel.setTable("battery")
        # Data storage,OnManualSubmit , OnRowChange
        self.tabModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
        # self.tabModel.setSort(
        #     self.tabModel.fieldIndex("RANDOM"),
        #     Qt.DescendingOrder)  # Sorting
        if (self.tabModel.select() == False):  # Failed to query the data
            QMessageBox.critical(
                self, "Wrong",
                "Something wrong. Failed to open the database\n" +
                self.tabModel.lastError().text())
            return
        # self.tabModel.setFilter("NUM_RECORDS LIKE 'NONE'")
        self.__getFieldNames()  # Get the field name and index

        # Field name shown
        for i in self.fldNum:
            self.tabModel.setHeaderData(self.fldNum[i], Qt.Horizontal,
                                        i.capitalize())

# Create mappings between interface widget and the field name of data model
        self.mapper = QDataWidgetMapper()
        self.mapper.setModel(self.tabModel)  # Setting data model
        self.mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)

        # The relations between interface widget and field name of tabModel
        self.mapper.addMapping(self.ui.dbEditValue, self.fldNum["Value"])
        self.mapper.addMapping(self.ui.dbEditRunit, self.fldNum["Raw_unit"])
        self.mapper.addMapping(self.ui.dbComboProperty,
                               self.fldNum["Property"])
        self.mapper.addMapping(self.ui.dbEditUnit, self.fldNum["Unit"])
        self.mapper.addMapping(self.ui.dbEditName, self.fldNum["Name"])
        self.mapper.addMapping(self.ui.dbEditEname,
                               self.fldNum["Extracted_name"])
        self.mapper.addMapping(self.ui.dbEditRvalue, self.fldNum["Raw_value"])
        self.mapper.addMapping(self.ui.dbEditDOI_2, self.fldNum["DOI"])
        self.mapper.addMapping(self.ui.dbEditDOI_4, self.fldNum["Date"])
        self.mapper.addMapping(self.ui.dbEditDOI_3, self.fldNum["Title"])
        self.mapper.addMapping(self.ui.dbEditDOI, self.fldNum["Journal"])
        self.mapper.addMapping(self.ui.dbEditTag, self.fldNum["Tag"])
        self.mapper.addMapping(self.ui.dbEditInfo, self.fldNum["Info"])
        self.mapper.addMapping(self.ui.dbEditType, self.fldNum["Type"])
        self.mapper.addMapping(self.ui.dbEditWarning, self.fldNum["Warning"])
        self.mapper.addMapping(self.ui.dbEditSpecifier,
                               self.fldNum["Specifier"])
        self.mapper.toFirst()  # Move to the first record

        self.selModel = QItemSelectionModel(self.tabModel)  # Select model
        self.selModel.currentChanged.connect(
            self.do_currentChanged)  # Trigger when the current changed
        self.selModel.currentRowChanged.connect(
            self.do_currentRowChanged)  # Trigger when the current row changed

        self.ui.tableView.setModel(self.tabModel)  # Setting the data model
        self.ui.tableView.setSelectionModel(
            self.selModel)  # Setting the selection model

        #      self.ui.tableView.setColumnHidden(self.fldNum["TAG"],   True)  #Hide columns
        # self.ui.tableView.setColumnHidden(self.fldNum["INFO"],  True)  #Hide
        # columns
        self.ui.tableView.setColumnHidden(self.fldNum["Extracted_name"],
                                          True)  # Hide columns
        self.ui.tableView.setColumnHidden(self.fldNum["Unit"],
                                          True)  # Hide columns
        self.ui.tableView.setColumnHidden(self.fldNum["Num_records"],
                                          True)  # Hide columns
        # self.ui.tableView.setColumnHidden(
        #     self.fldNum["RAW_VALUE"], True)  # Hide columns

        # Update the conditions of actions of interface widget
        self.ui.actRecAppend.setEnabled(True)
        self.ui.actRecInsert.setEnabled(True)
        self.ui.actRecDelete.setEnabled(True)

        self.ui.btnDrawPieChart.setEnabled(True)  # Pie Chart
        self.ui.spinPieSize.setEnabled(True)
        self.ui.spinHoleSize.setEnabled(True)
        self.ui.chkBox_PieLegend.setEnabled(True)

        self.ui.generateButton_3.setEnabled(True)
        self.ui.searchButton_3.setEnabled(True)
        self.ui.clearButton_3.setEnabled(True)

        self.ui.frame_4.setEnabled(True)
        self.ui.frame_3.setEnabled(True)

        self.ui.searchInput.returnPressed.connect(self.ui.searchButton.click)
        self.ui.searchInput_3.returnPressed.connect(
            self.ui.searchButton_3.click)

    def __iniPieChart(self):  # Initialize pie chart
        chart = QChart()
        # chart.setTitle("Piechart")
        chart.setAnimationOptions(QChart.SeriesAnimations)
        chart.setTheme(QChart.ChartTheme(0))
        self.ui.chartViewPie.setChart(chart)  # Setting chart for chart view
        self.ui.chartViewPie.setRenderHint(QPainter.Antialiasing)
        self.ui.chartViewPie.setCursor(Qt.CrossCursor)  # Setting cross cursor

    def __iniStackedBar(self):  # Initialize stacked bar chart
        chart = QChart()
        # chart.setTitle("Number of property records for each chemical")
        chart.setAnimationOptions(QChart.SeriesAnimations)
        chart.setTheme(QChart.ChartTheme(0))
        self.ui.chartViewStackedBar.setChart(chart)  # Set chart
        self.ui.chartViewStackedBar.setRenderHint(QPainter.Antialiasing)
        self.ui.chartViewStackedBar.setCursor(Qt.CrossCursor)  # Set mouse

# ==========Table tab slot function==================

    @pyqtSlot()  # Save changes
    def on_actSubmit_triggered(self):
        res = self.tabModel.submitAll()
        if (res == False):
            QMessageBox.information(
                self, "Information",
                "Failed to store the changes. Wrong information. \n" +
                self.tabModel.lastError().text())
        else:
            self.ui.actSubmit.setEnabled(False)
            self.ui.actRevert.setEnabled(False)

    @pyqtSlot()  # Cancel changes
    def on_actRevert_triggered(self):
        self.tabModel.revertAll()
        self.ui.actSubmit.setEnabled(False)
        self.ui.actRevert.setEnabled(False)

    @pyqtSlot()  # Add records
    def on_actRecAppend_triggered(self):
        self.tabModel.insertRow(
            self.tabModel.rowCount(),
            QModelIndex())  # Add one record in the last row
        curIndex = self.tabModel.index(self.tabModel.rowCount() - 1,
                                       1)  # Create ModelIndex of the last row
        self.selModel.clearSelection()  # Clear selections
        # Choosing the current row when selection.
        self.selModel.setCurrentIndex(curIndex, QItemSelectionModel.Select)

        currow = curIndex.row()  # Get current row

    @pyqtSlot()  # Insert records
    def on_actRecInsert_triggered(self):
        curIndex = self.ui.tableView.currentIndex()  # QModelIndex
        self.tabModel.insertRow(curIndex.row(), QModelIndex())
        self.selModel.clearSelection()  # Clear selections
        self.selModel.setCurrentIndex(curIndex, QItemSelectionModel.Select)

    @pyqtSlot()  # Delete records
    def on_actRecDelete_triggered(self):
        # Get the current index of current model
        curIndex = self.selModel.currentIndex()
        self.tabModel.removeRow(curIndex.row(),
                                QModelIndex())  # Delete the current row
        self.tabModel.submit()

    @pyqtSlot()  # Help message box
    def on_actHelp_triggered(self):
        msg = QMessageBox()
        msg.about(
            self, "Help", '<div>'
            '<h3>Table:&nbsp;Query&nbsp;the&nbsp;database&nbsp;according&nbsp;to&nbsp;data&nbsp;types&nbsp;and&nbsp;name&nbsp;or&nbsp;DOI.</h3>'
            '<ul>'
            '<li>Search&nbsp;the&nbsp;exact&nbsp;compound&nbsp;name&nbsp;in&nbsp;"<em>Exact&nbsp;Match</em>". Search&nbsp;the&nbsp;element&nbsp;or&nbsp;part&nbsp;of&nbsp;compound&nbsp;name&nbsp;in&nbsp;"<em>Generic&nbsp;Match</em>".&nbsp;</li>'
            '<li>Click the "<em>Home</em>" or "<em>All</em>" button to view the full database</li>'
            '<li>Refer&nbsp;to&nbsp;"<em>Correctness</em>"&nbsp;column&nbsp;for&nbsp;database&nbsp;evaluation&nbsp;details.&nbsp;</li>'
            '<li>You can add your own database entries using the "<em>Insert</em>" tab; click "<em>Save</em>" to save the changes.</li>'
            '</ul>'
            '<h3>Figure:&nbsp;Statistical&nbsp;analysis&nbsp;of&nbsp;the&nbsp;database.</h3>'
            '<ul>'
            '<li><em>Pie&nbsp;chart</em>&nbsp;shows&nbsp;the&nbsp;proportion&nbsp;of&nbsp;data&nbsp;records.</li>'
            '<li><em>Stacked&nbsp;bar&nbsp;chart</em>&nbsp;shows&nbsp;the&nbsp;data&nbsp;types&nbsp;for&nbsp;each&nbsp;compound. First&nbsp;input&nbsp;the&nbsp;compound&nbsp;name,&nbsp;click&nbsp;"<em>Add</em>"&nbsp;and&nbsp;then&nbsp;"<em>Generate</em>"&nbsp;data&nbsp;for&nbsp;overview.&nbsp;</li>'
            '<li><em>Histogram&nbsp;</em>shows&nbsp;the&nbsp;distribution&nbsp;of&nbsp;each&nbsp;data&nbsp;type.</li>'
            '<li><em>Venn&nbsp;diagram</em>&nbsp;shows&nbsp;the&nbsp;correlation&nbsp;of&nbsp;each&nbsp;data&nbsp;type.</li>'
            '</ul>'
            '</div>')

    @pyqtSlot()  # Filtering
    def on_radioBtnVoltage_clicked(self):
        flag, sqlmerge = self.merged_or_not()
        print(sqlmerge)
        self.tabModel.setFilter("PROPERTY LIKE 'Voltage' AND %s" % sqlmerge)

    @pyqtSlot()  # Filtering
    def on_radioBtnCoulombic_clicked(self):
        flag, sqlmerge = self.merged_or_not()
        self.tabModel.setFilter("PROPERTY LIKE 'Coulombic Efficiency' AND %s" %
                                sqlmerge)

    @pyqtSlot()  # Filtering
    def on_radioBtnConductivity_clicked(self):
        flag, sqlmerge = self.merged_or_not()
        self.tabModel.setFilter("PROPERTY LIKE 'Conductivity' AND %s" %
                                sqlmerge)

    @pyqtSlot()  # Filetering
    def on_radioBtnCapacity_clicked(self):
        flag, sqlmerge = self.merged_or_not()
        self.tabModel.setFilter("PROPERTY LIKE 'Capacity' AND %s" % sqlmerge)

    @pyqtSlot()  # Filtering
    def on_radioBtnEnergy_clicked(self):
        flag, sqlmerge = self.merged_or_not()
        self.tabModel.setFilter("PROPERTY LIKE 'Energy' AND %s" % sqlmerge)

    @pyqtSlot()  # Cancel Filetering
    def on_radioBtnAll_clicked(self):
        flag, sqlmerge = self.merged_or_not()
        self.tabModel.setFilter("%s" % sqlmerge)

    # print(self.tabModel.filter())
    # self.tabModel.select()

    def get_elements(self):
        element_dic = {
            "Hydrogen": "H",
            "Helium": "He",
            "Lithium": "Li",
            "Beryllium": "Be",
            "Boron": "B",
            "Carbon": "C",
            "Nitrogen": "N",
            "Oxygen": "O",
            "Fluorine": "F",
            "Neon": "Ne",
            "Sodium": "Na",
            "Magnesium": "Mg",
            "Aluminum": "Al",
            "Silicon": "Si",
            "Phosphorus": "P",
            "Sulfur": "S",
            "Chlorine": "Cl",
            "Argon": "Ar",
            "Potassium": "K",
            "Calcium": "Ca",
            "Scandium": "Sc",
            "Titanium": "Ti",
            "Vanadium": "V",
            "Chromium": "Cr",
            "Manganese": "Mn",
            "Iron": "Fe",
            "Cobalt": "Co",
            "Nickel": "Ni",
            "Copper": "Cu",
            "Zinc": "Zn",
            "Gallium": "Ga",
            "Germanium": "Ge",
            "Arsenic": "As",
            "Selenium": "Se",
            "Bromine": "Br",
            "Krypton": "Kr",
            "Rubidium": "Rb",
            "Strontium": "Sr",
            "Yttrium": "Y",
            "Zirconium": "Zr",
            "Niobium": "Nb",
            "Molybdenum": "Mo",
            "Technetium": "Tc",
            "Ruthenium": "Ru",
            "Rhodium": "Rh",
            "Palladium": "Pd",
            "Silver": "Ag",
            "Cadmium": "Cd",
            "Indium": "In",
            "Tin": "Sn",
            "Antimony": "Sb",
            "Tellurium": "Te",
            "Iodine": "I",
            "Xenon": "Xe",
            "Cesium": "Cs",
            "Barium": "Ba",
            "Lanthanum": "La",
            "Cerium": "Ce",
            "Praseodymium": "Pr",
            "Neodymium": "Nd",
            "Promethium": "Pm",
            "Samarium": "Sm",
            "Europium": "Eu",
            "Gadolinium": "Gd",
            "Terbium": "Tb",
            "Dysprosium": "Dy",
            "Holmium": "Ho",
            "Erbium": "Er",
            "Thulium": "Tm",
            "Ytterbium": "Yb",
            "Lutetium": "Lu",
            "Hafnium": "Hf",
            "Tantalum": "Ta",
            "Tungsten": "W",
            "Rhenium": "Re",
            "Osmium": "Os",
            "Iridium": "Ir",
            "Platinum": "Pt",
            "Gold": "Au",
            "Mercury": "Hg",
            "Thallium": "Tl",
            "Lead": "Pb",
            "Bismuth": "Bi",
            "Polonium": "Po",
            "Astatine": "At",
            "Radon": "Rn",
            "Francium": "Fr",
            "Radium": "Ra",
            "Actinium": "Ac",
            "Thorium": "Th",
            "Protactinium": "Pa",
            "Uranium": "U",
            "Neptunium": "Np",
            "Plutonium": "Pu",
            "Americium": "Am",
            "Curium": "Cm",
            "Berkelium": "Bk",
            "Californium": "Cf",
            "Einsteinium": "Es",
            "Fermium": "Fm",
            "Mendelevium": "Md",
            "Nobelium": "No",
            "Lawrencium": "Lr",
            "Rutherfordium": "Rf",
            "Dubnium": "Db",
            "Seaborgium": "Sg",
            "Bohrium": "Bh",
            "Hassium": "Hs",
            "Meitnerium": "Mt",
            "Darmstadtium": "Ds",
            "Roentgenium": "Rg",
            "Copernicium": "Cn",
            "Nihonium": "Nh",
            "Flerovium": "Fl",
            "Moscovium": "Mc",
            "Livermorium": "Lv",
            "Tennessine": "Ts",
            "Oganesson": "Og"
        }
        return element_dic

    def merged_or_not(self):
        flag = self.ui.mergeBox.isChecked()
        if flag:
            sqlmerge = "NUM_RECORDS NOT LIKE 'NONE'"
        else:
            sqlmerge = "NUM_RECORDS LIKE 'NONE'"
        return flag, sqlmerge

    @pyqtSlot()
    def on_homeButton_clicked(self):
        self.tabModel.setFilter("NUM_RECORDS LIKE 'NONE'")
        self.ui.mergeBox.setChecked(False)

    @pyqtSlot()
    def on_mergeButton_clicked(self):
        self.tabModel.setFilter("NUM_RECORDS NOT LIKE 'NONE'")
        self.ui.mergeBox.setChecked(True)

    @pyqtSlot()
    def on_searchButton_clicked(self):
        searchtext = self.ui.searchInput.text()
        searchclass = self.ui.searchClass.currentText()
        matchtype = self.ui.matchType.currentText()
        flag, sqlmerge = self.merged_or_not()

        if searchclass == "DOI":
            if matchtype == "Exact Match":
                self.tabModel.setFilter("DOI LIKE '%s' AND %s" %
                                        (searchtext, sqlmerge))
            elif matchtype == "Generic Match":
                self.tabModel.setFilter("DOI LIKE '%%%s%%' AND %s" %
                                        (searchtext, sqlmerge))

            if self.tabModel.rowCount() == 0:
                self.tabModel.setFilter("")
                QMessageBox.warning(
                    self, "Warning",
                    "No such DOIs in the database. Please search new DOI.")

        elif searchclass == "Warning":
            if matchtype == "Exact Match":
                self.tabModel.setFilter("WARNING LIKE '%s' AND %s" %
                                        (searchtext, sqlmerge))
            elif matchtype == "Generic Match":
                self.tabModel.setFilter("WARNING LIKE '%%%s%%' AND %s" %
                                        (searchtext, sqlmerge))

            if self.tabModel.rowCount() == 0:
                self.tabModel.setFilter("")
                QMessageBox.warning(
                    self, "Warning",
                    "No such DOIs in the database. Please search new DOI.")

        elif searchclass == 'Name':
            try:
                searchtext = self.get_elements()[searchtext.capitalize()]
            except BaseException:
                pass
            if matchtype == "Exact Match":
                if self.ui.radioBtnAll.isChecked():
                    self.tabModel.setFilter("%s LIKE '%s' " %
                                            (searchclass, searchtext))
                elif self.ui.radioBtnVoltage.isChecked():
                    self.tabModel.setFilter(
                        "%s LIKE '%s' AND PROPERTY LIKE 'VOLTAGE' AND %s" %
                        (searchclass, searchtext, sqlmerge))
                elif self.ui.radioBtnCapacity.isChecked():
                    self.tabModel.setFilter(
                        "%s LIKE '%s' AND PROPERTY LIKE 'CAPACITY' AND %s" %
                        (searchclass, searchtext, sqlmerge))
                elif self.ui.radioBtnConductivity.isChecked():
                    self.tabModel.setFilter(
                        "%s LIKE '%s' AND PROPERTY LIKE 'CONDUCTIVITY' AND %s"
                        % (searchclass, searchtext, sqlmerge))
                elif self.ui.radioBtnCoulombic.isChecked():
                    self.tabModel.setFilter(
                        "%s LIKE '%s' AND PROPERTY LIKE 'COULOMBIC EFFICIENCY' AND %s "
                        % (searchclass, searchtext, sqlmerge))
                elif self.ui.radioBtnEnergy.isChecked():
                    self.tabModel.setFilter(
                        "%s LIKE '%s' AND PROPERTY LIKE 'ENERGY'AND %s " %
                        (searchclass, searchtext, sqlmerge))

            elif matchtype == "Generic Match":
                if self.ui.radioBtnAll.isChecked():
                    self.tabModel.setFilter(
                        "(EXTRACTED_NAME LIKE '%%''%s''%%' OR NAME LIKE '%s') AND %s"
                        % (searchtext, searchtext, sqlmerge))
                elif self.ui.radioBtnVoltage.isChecked():
                    self.tabModel.setFilter(
                        "EXTRACTED_NAME LIKE '%%''%s''%%' OR NAME LIKE '%s' AND %s"
                        % (searchtext, searchtext, sqlmerge))
                elif self.ui.radioBtnCapacity.isChecked():
                    self.tabModel.setFilter(
                        "EXTRACTED_NAME LIKE '%%''%s''%%' OR NAME LIKE '%s' AND %s"
                        % (searchtext, searchtext, sqlmerge))
                elif self.ui.radioBtnConductivity.isChecked():
                    self.tabModel.setFilter(
                        "EXTRACTED_NAME LIKE '%%''%s''%%' OR NAME LIKE '%s' AND %s"
                        % (searchtext, searchtext, sqlmerge))
                elif self.ui.radioBtnCoulombic.isChecked():
                    self.tabModel.setFilter(
                        "EXTRACTED_NAME LIKE '%%''%s''%%' OR NAME LIKE '%s' AND %s"
                        % (searchtext, searchtext, sqlmerge))
                elif self.ui.radioBtnEnergy.isChecked():
                    self.tabModel.setFilter(
                        "EXTRACTED_NAME LIKE '%%''%s''%%' OR NAME LIKE '%s' AND %s"
                        % (searchtext, searchtext, sqlmerge))

            if self.tabModel.rowCount() == 0:
                self.tabModel.setFilter("")
                QMessageBox.warning(
                    self, "Warning",
                    "No such compounds in the database. Please search new compounds."
                )

# ============Picture Tab 1, Pie Chart=====================

    @pyqtSlot()  # Draw the pie chart
    def on_btnDrawPieChart_clicked(self):
        self.draw_pieChart()

    @pyqtSlot(float)  # Set holeSize
    def on_spinHoleSize_valueChanged(self, arg1):
        seriesPie = self.ui.chartViewPie.chart().series()[0]
        seriesPie.setHoleSize(arg1)

    @pyqtSlot(float)  # Set pieSize
    def on_spinPieSize_valueChanged(self, arg1):
        seriesPie = self.ui.chartViewPie.chart().series()[0]
        seriesPie.setPieSize(arg1)

    @pyqtSlot(bool)  # Set legend checkbox
    def on_chkBox_PieLegend_clicked(self, checked):
        self.ui.chartViewPie.chart().legend().setVisible(checked)

    def pie_data(
            self):  # Return a list of property name and the number of property
        num_list = []
        pro_list = [
            "CAPACITY", "CONDUCTIVITY", "COULOMBIC EFFICIENCY", "ENERGY",
            "VOLTAGE"
        ]
        for i in range(len(pro_list)):
            query = QSqlQuery(
                db=self.DB,
                query=
                "SELECT COUNT(NAME) FROM BATTERY WHERE PROPERTY LIKE '%s' AND NUM_RECORDS LIKE 'NONE'"
                % pro_list[i])  # Query database
            while query.next():
                num_value = query.value(0)  # Returned value for each query

                item = self.ui.treeWidget_2.topLevelItem(i)  # The ith row
                # The 2nd column
                item.setText(1, str(num_value))
                item.setTextAlignment(1, Qt.AlignHCenter)

                num_list.append(num_value)
        return pro_list, num_list

    def draw_pieChart(self):  # Draw the pie chart
        chart = self.ui.chartViewPie.chart()

        chart.legend().setAlignment(Qt.AlignRight)  # AlignRight,AlignBottom
        chart.removeAllSeries()  # Delete all series

        seriesPie = QPieSeries()  # Pie chart series
        seriesPie.setHoleSize(self.ui.spinHoleSize.value())  # Hole size
        seriesPie.setPieSize(self.ui.spinPieSize.value())  # Pie size
        sec_count = 5  # Number of properties
        seriesPie.setLabelsVisible(True)  # Label

        pro, num = self.pie_data()
        for i in range(sec_count):
            seriesPie.append(pro[i], num[i])

        seriesPie.setLabelsVisible(True)  # Label

        # Pie hoverd when mouse selected
        seriesPie.hovered.connect(self.do_pieHovered)
        chart.addSeries(seriesPie)
        chart.setTitle("Proportion of data records for each property")
        font = QFont()
        font.setPointSize(12)
        font.setWeight(75)
        chart.setTitleFont(font)

        font = QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(35)
        legend = chart.legend()
        legend.setFont(font)

# =========Picture tab 2. StackedBar=========

    @pyqtSlot()  # Draw StackedBar
    def on_btnStackedBar_clicked(self):
        self.draw_stackedBar()

    @pyqtSlot()  # Draw horizontal StackedBar
    def on_btnStackedBarH_clicked(self):
        self.draw_stackedBar(False)

    # Search button in the Stacked bar chart tab. Add name to the first column
    # of the table.
    @pyqtSlot()
    def on_searchButton_3_clicked(self):
        searchtext = self.ui.searchInput_3.text()

        current_index = self.ui.stackedWidget.topLevelItemCount()
        item_0 = QtWidgets.QTreeWidgetItem(self.ui.stackedWidget)
        item_0.setText(0, searchtext)

    @pyqtSlot()  # Generate data using the input chemical names
    def on_generateButton_3_clicked(self):
        self.ui.zoominButton.setEnabled(True)
        self.ui.zoomoutButton.setEnabled(True)
        self.ui.originalButton.setEnabled(True)
        self.ui.btnStackedBar.setEnabled(True)  # Stacked bar chart
        self.ui.btnStackedBarH.setEnabled(True)

        current_index = self.ui.stackedWidget.topLevelItemCount()
        chemical_list = [
            self.ui.stackedWidget.topLevelItem(index).text(0)
            for index in range(current_index)
        ]  # Get a list of the inputed chemical name
        pro_list = [
            "CAPACITY", "CONDUCTIVITY", "COULOMBIC EFFICIENCY", "ENERGY",
            "VOLTAGE"
        ]
        for row, chemical in enumerate(chemical_list):
            for index, pro in enumerate(pro_list):
                query = QSqlQuery(
                    db=self.DB,
                    query=
                    "SELECT SUM(NUM_RECORDS) FROM BATTERY WHERE PROPERTY LIKE '%s' AND NAME LIKE '%s' "
                    % (pro, chemical))
                while query.next():
                    num_value = query.value(0)
                    print(num_value)
                    if num_value == "":
                        num_value = 0
                    item = self.ui.stackedWidget.topLevelItem(
                        row)  # The row'th row
                    item.setText(index + 1, str(num_value))
                    item.setTextAlignment(index + 1, Qt.AlignHCenter)

    @pyqtSlot()  # Clear button
    def on_clearButton_3_clicked(self):
        self.ui.stackedWidget.clear()

    @pyqtSlot()  # Zoom in
    def on_zoominButton_clicked(self):
        self.ui.chartViewStackedBar.chart().zoom(1.2)

    @pyqtSlot()  # Zoom out
    def on_zoomoutButton_clicked(self):
        self.ui.chartViewStackedBar.chart().zoom(0.8)

    @pyqtSlot()  # Reset original size
    def on_originalButton_clicked(self):
        self.ui.chartViewStackedBar.chart().zoomReset()

    def draw_stackedBar(self, isVertical=True):  # Stacked bar chart
        chart = self.ui.chartViewStackedBar.chart()
        chart.removeAllSeries()  # Remove all series
        chart.removeAxis(chart.axisX())  # remove axis
        chart.removeAxis(chart.axisY())
        if isVertical:  # Vertical
            chart.setTitle("Number of property records for each chemical ")
            chart.legend().setAlignment(Qt.AlignBottom)
        else:  # Horizontal
            chart.setTitle("Number of property records for each chemical")
            chart.legend().setAlignment(Qt.AlignRight)

        # Create data sets
        setCapacity = QBarSet("Capacity")
        setConductivity = QBarSet("Conductivity")
        setCoulombic = QBarSet("Coulombic")
        setEnergy = QBarSet("Energy")
        setVoltage = QBarSet("Voltage")

        chemical_Count = self.ui.stackedWidget.topLevelItemCount()
        nameList = []  # Chemical lists
        for i in range(chemical_Count):
            item = self.ui.stackedWidget.topLevelItem(i)
            # print(item.text(1))
            nameList.append(item.text(0))
            setCapacity.append(float(item.text(1)))
            setConductivity.append(float(item.text(2)))
            setCoulombic.append(float(item.text(3)))
            setEnergy.append(float(item.text(4)))
            setVoltage.append(float(item.text(5)))

        # Create series
        if isVertical:
            seriesBar = QStackedBarSeries()
        else:
            seriesBar = QHorizontalStackedBarSeries()

        seriesBar.append(setCapacity)
        seriesBar.append(setConductivity)
        seriesBar.append(setCoulombic)
        seriesBar.append(setEnergy)
        seriesBar.append(setVoltage)

        seriesBar.setLabelsVisible(True)  # Show labels for each bar
        seriesBar.setLabelsFormat("@value")
        seriesBar.setLabelsPosition(QAbstractBarSeries.LabelsCenter)

        seriesBar.setBarWidth(0.3)

        chart.addSeries(seriesBar)

        axisStud = QBarCategoryAxis()  # Category axis
        axisStud.append(nameList)
        axisStud.setRange(nameList[0], nameList[chemical_Count - 1])

        axisValue = QValueAxis()  # Value axis
        # axisValue.setRange(0, 300)
        axisValue.setTitleText("Number of records")
        # axisValue.setTickCount(6)
        axisValue.applyNiceNumbers()

        if isVertical:
            chart.setAxisX(axisStud, seriesBar)
            chart.setAxisY(axisValue, seriesBar)
        else:
            chart.setAxisY(axisStud, seriesBar)
            chart.setAxisX(axisValue, seriesBar)

        for marker in chart.legend().markers():  # QLegendMarker lists
            marker.clicked.connect(self.do_LegendMarkerClicked)

# =========Picture tab 3. Histogram=========

    @pyqtSlot(bool)  # Show toolbar
    def on_gBoxHist_toolbar_2_clicked(self, checked):
        self.ui.widgetHist_2.setToolbarVisible(checked)

    @pyqtSlot()  # Draw
    def on_histButton_clicked(self):
        self.__drawHist()

    def hist_data(self, pro):
        query = QSqlQuery(
            db=self.DB,
            query=
            "SELECT VALUE FROM BATTERY WHERE PROPERTY LIKE '%s' AND NUM_RECORDS LIKE 'NONE'"
            % pro)
        data = []
        while query.next():
            num_value = query.value(0)
            data.append(num_value)
        return data

    def __drawHist(self):  # Histogram
        pro = self.ui.propertycomboBox_2.currentText()
        data = self.hist_data(pro)
        self.ui.widgetHist_2.figure.clear()  # Clear figure

        ax = self.ui.widgetHist_2.figure.add_subplot(1, 1, 1)

        if pro == 'Capacity':
            M, bins, patches = ax.hist(
                [5000 if float(i) > 4999 else float(i) for i in data],
                bins='auto',
                color='darkgreen',
                alpha=0.5,
                rwidth=1)
            ax.set_xlim(0, 5001)
            # ax.set_ylim(0,15000)
            ax.tick_params(labelsize=12)
            ax.set_xticklabels(['0', '1000', '2000', '3000', '4000', '5000+'])
            ax.set_xlabel('Capacity (mAh/g)', fontsize=14)
            ax.set_ylabel('Frequency', fontsize=14)
            ax.set_title('Battery Capacity Distrbution', fontsize=14)
            ax.figure.canvas.draw()

        elif pro == "Voltage":
            count1 = []
            for i in data:
                count1.append(float(i))

            n, bins, patches = ax.hist(x=count1,
                                       bins='auto',
                                       range=(0, 8),
                                       color='r',
                                       alpha=0.5,
                                       rwidth=1)
            ax.set_xticklabels(['0', '1', '2', '3', '4', '5', '6', '7', '8+'])

            ax.set_xlim(0, 8)
            ax.tick_params(labelsize=12)
            ax.set_xlabel('Voltage (V)', fontsize=14)
            ax.set_ylabel('Frequency', fontsize=14)
            ax.set_title('Battery Voltage Distrbution', fontsize=14)
            ax.figure.canvas.draw()

        elif pro == "Energy":
            n, bins, patches = ax.hist(
                [3000 if float(i) > 2999 else float(i) for i in data],
                bins='auto',
                color='y',
                alpha=0.5,
                rwidth=1)
            ax.set_xticklabels(
                ['0', '500', '1000', '1500', '2000', '2500', '3000+'])
            ax.set_xlim(0, 3001)
            ax.tick_params(labelsize=12)
            ax.set_xlabel('Energy (Wh/kg)', fontsize=14)
            ax.set_ylabel('Frequency', fontsize=14)
            ax.set_title('Battery Energy Distrbution', fontsize=14)
            ax.figure.canvas.draw()

        elif pro == "Coulombic Efficiency":
            dataplot = [float(i) for i in data]
            n, bins, patches = ax.hist(x=dataplot,
                                       bins='auto',
                                       color='c',
                                       alpha=0.5,
                                       rwidth=1)
            ax.set_xlim(0, 100)
            ax.tick_params(labelsize=12)
            ax.set_xlabel('Coulombic Effciency (%)', fontsize=14)
            ax.set_ylabel('Frequency', fontsize=14)
            ax.set_title('Battery Coulombic Effciency Distrbution',
                         fontsize=14)
            ax.figure.canvas.draw()

        elif pro == "Conductivity":
            dataplot = [float(i) for i in data]
            n, bins, patches = ax.hist(x=dataplot,
                                       bins=np.logspace(
                                           np.log10(1e-15), np.log10(1)),
                                       color='k',
                                       alpha=0.5,
                                       rwidth=1)
            ax.set_xlim(1e-20, 10)
            ax.set_xscale('log')
            ax.tick_params(labelsize=12)
            ax.set_xlabel('log10 (Conductivity (S/cm))', fontsize=14)
            ax.set_ylabel('Frequency', fontsize=14)
            ax.set_title('Battery Conductivity Distrbution', fontsize=14)
            ax.figure.canvas.draw()

# =========Picture tab 4. Venn diagram=========

    @pyqtSlot()  # Draw
    def on_btnVenn_clicked(self):
        self.__drawVenn()

    @pyqtSlot(bool)  # Show toolbar
    def on_gBoxHist_toolbar_3_clicked(self, checked):
        self.ui.widgetVenn.setToolbarVisible(checked)

    def __drawVenn(self):
        self.ui.widgetVenn.figure.clear()  # Clear figure

        pro_list = [
            "Capacity", "Conductivity", "Coulombic Efficiency", "Energy",
            "Voltage"
        ]
        data_dic = {}
        color_dic = dict(zip(pro_list, ['C0', 'C2', 'C6', 'C8', 'C9']))

        for i in pro_list:
            query = QSqlQuery(
                db=self.DB,
                query=
                "SELECT COUNT(DISTINCT NAME) FROM BATTERY WHERE PROPERTY LIKE '%s' AND NUM_RECORDS LIKE 'NONE'"
                % i)
            while query.next():
                num_value = query.value(0)
                data_dic[i] = num_value

        for i, combo in enumerate(itertools.combinations(pro_list, 2)):

            query = QSqlQuery(
                db=self.DB,
                query=
                "SELECT COUNT() FROM (SELECT DISTINCT NAME AS PRO1 FROM BATTERY WHERE PROPERTY LIKE '%s'AND NUM_RECORDS LIKE 'NONE') INNER JOIN (SELECT DISTINCT NAME AS PRO2 FROM BATTERY WHERE PROPERTY LIKE '%s'AND NUM_RECORDS LIKE 'NONE') ON PRO1 = PRO2"
                % combo)
            while query.next():
                num = query.value(0)
            x3 = num
            x1 = data_dic[combo[0]] - x3
            x2 = data_dic[combo[1]] - x3

            hf = self.ui.widgetVenn.figure
            # hf.set_figheight(30)
            # hf.set_figwidth(30)
            # print(dir(hf))

            hf.set_size_inches((10, 10))
            ax1 = hf.add_subplot(5, 2, i + 1)
            v = venn2(subsets=(x1, x2, x3),
                      set_labels=(combo[0], combo[1]),
                      ax=ax1)

            v.get_patch_by_id('A').set_alpha(1)
            v.get_patch_by_id('A').set_color(color_dic[combo[0]])
            v.get_patch_by_id('B').set_color(color_dic[combo[1]])

            ax1.figure.canvas.draw()

# =============Self-defined slot function===============================

# Update the conditions of actPost and actCancel

    def do_currentChanged(self, current, previous):
        self.ui.actSubmit.setEnabled(
            self.tabModel.isDirty())  # Use when not saving changes
        self.ui.actRevert.setEnabled(self.tabModel.isDirty())

    def do_currentRowChanged(self, current,
                             previous):  # Control during row changes
        self.ui.actRecDelete.setEnabled(current.isValid())

        # Update current row index of mapping
        self.mapper.setCurrentIndex(current.row())
        # Get current record,QSqlRecord
        curRec = self.tabModel.record(current.row())

    def do_pieHovered(self, pieSlice,
                      state):  # Mouse move in and out in the pie chart
        pieSlice.setExploded(state)  # Pop-up animation
        if state:  # Show the tab of percentages
            self.__oldLabel = pieSlice.label()  # Save original labels
            pieSlice.setLabel(self.__oldLabel + ": %.1f%%" %
                              (pieSlice.percentage() * 100))
            font = QFont()
            font.setPointSize(10)
            font.setBold(False)
            font.setWeight(25)
            pieSlice.setLabelFont(font)
        else:  # show original labels
            pieSlice.setLabel(self.__oldLabel)
            font = QFont()
            font.setPointSize(10)
            font.setBold(False)
            font.setWeight(25)
            pieSlice.setLabelFont(font)

    def do_LegendMarkerClicked(self):  # Click legend marker
        marker = self.sender()  # QLegendMarker

        marker.series().setVisible(not marker.series().isVisible())
        marker.setVisible(True)
        alpha = 1.0
        if not marker.series().isVisible():
            alpha = 0.5

        brush = marker.labelBrush()  # QBrush
        color = brush.color()  # QColor
        color.setAlphaF(alpha)
        brush.setColor(color)
        marker.setLabelBrush(brush)

        brush = marker.brush()
        color = brush.color()
        color.setAlphaF(alpha)
        brush.setColor(color)
        marker.setBrush(brush)

        pen = marker.pen()  # QPen
        color = pen.color()
        color.setAlphaF(alpha)
        pen.setColor(color)
        marker.setPen(pen)