示例#1
0
    def widget_init(self):
        # combobox without scrolling
        class myComboBox(QComboBox):
            def wheelEvent(self, *args, **kwargs): pass

        # holding table refresh
        if self.tableWidget.rowCount() != len(self.srv.devices[0].holdings):
            # print device information
            print("holdings count=", len(self.srv.devices[0].holdings))
            print("inputs count=", len(self.srv.devices[0].inputs))
            # reading data from prm.json file
            with open('PRM.json', 'r', encoding='Windows-1251') as fh:  # открываем файл на чтение
                self.jsdtr = json.load(fh)  # загружаем из файла данные в словарь data
            # set table row value
            self.tableWidget.setRowCount(len(self.srv.devices[0].holdings))
            for x, el in enumerate(self.srv.devices[0].holdings):
                if x < len(self.jsdtr):
                    # writing parameter name from prm.json data to column 0, 2
                    item = QTableWidgetItem(self.jsdtr[x][0])
                    # disabling column 0 item changing
                    item.setFlags(QtCore.Qt.ItemIsEnabled)
                    self.tableWidget.setItem(x, 0, item)
                    # additional combobox and button control at column 2 and 3
                    if len(self.jsdtr[x]) > 1:
                        tbtn = QPushButton()
                        tbtn.setMaximumSize(100, 75)
                        tbtn.setText("Задать")
                        self.tableWidget.setCellWidget(x, 3, tbtn)
                        #combox
                        cmb = myComboBox()
                        self.tableWidget.setCellWidget(x, 2, cmb)
                        for item in self.jsdtr[x][1]:
                            # adding item at combobox
                            self.tableWidget.cellWidget(x, 2).addItem(item[0])
                            # Switch combobox to current value
                            if self.srv.devices[0].holdings[x] < self.tableWidget.cellWidget(x, 2).count():
                                self.tableWidget.cellWidget(x, 2).setCurrentIndex(self.srv.devices[0].holdings[x])
                            else:
                                self.tableWidget.cellWidget(x, 2).setCurrentIndex(-1)
                        #self.tableWidget.cellWidget(x, 2).setFixedWidth(150)

                        # connecting event to combobox
                        # self.tableWidget.cellWidget(x, 2).currentIndexChanged.connect(item_indCng)
                        # connecting event to button
                        # Combobox index changing event
                        def signal_btnpressed():
                            try:
                                # combobox current index
                                tmp = self.tableWidget.cellWidget(self.tableWidget.currentRow(), 2).currentIndex()
                                if tmp == -1: return False
                                # holding cell value
                                tmp2 = int(self.tableWidget.cellWidget(self.tableWidget.currentRow(), 1).text())
                                if tmp != tmp2:
                                    # marking cell
                                    self.marking_cell(self.tableWidget.currentRow())
                                    # request for server to write value
                                    if len(self.jsdtr[self.tableWidget.currentRow()]) > 1:
                                        if len(self.jsdtr[self.tableWidget.currentRow()][1][tmp]) == 2:
                                            # get cell value from json structure
                                            tmp = self.jsdtr[self.tableWidget.currentRow()][1][tmp][1]
                                    req = "write 0 " + str(self.tableWidget.currentRow()) + " " + str(tmp)
                                    self.cmd_list.append(req)
                                    # cell value changing
                                    self.tableWidget.cellWidget(self.tableWidget.currentRow(), 1).setText(str(tmp))
                                return True
                            except AttributeError:
                                return False

                        self.tableWidget.cellWidget(x, 3).clicked.connect(signal_btnpressed)
                        self.tableWidget.cellWidget(x, 3).setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
                    # if no additional combobox
                    else:
                        # disabling cell changing at column 2
                        item = QTableWidgetItem("")
                        item.setFlags(QtCore.Qt.ItemIsEnabled)
                        self.tableWidget.setItem(x, 2, item)
                # if no data at prm.json
                else:
                    # disabling cell changing at column 0,2
                    item = QTableWidgetItem("")
                    item.setFlags(QtCore.Qt.ItemIsEnabled)
                    # self.tableWidget.setItem(x, 2, item)
                    self.tableWidget.setItem(x, 0, item)
                # Set cell value at column 1
                item = QLineEdit(str(self.srv.devices[0].holdings[x]))
                item.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
                item.setMaxLength(6)
                item.setMaximumSize(100, 100)
                # Only int numbers
                item.setValidator(QIntValidator(-65536, 65536))

                # Cell value changing event
                def signal_cellpressed():
                    try:
                        # cell current value
                        tmp = int(self.tableWidget.cellWidget(self.tableWidget.currentRow(), 1).text())
                        # check for combobox item count
                        if self.tableWidget.cellWidget(self.tableWidget.currentRow(), 2) is not None:
                            if tmp > self.tableWidget.cellWidget(self.tableWidget.currentRow(), 2).count(): tmp = -1
                            # changing combobox index
                            self.tableWidget.cellWidget(self.tableWidget.currentRow(), 2).setCurrentIndex(tmp)
                    except (ValueError, AttributeError) as e:
                        print(e)
                    # marking cell
                    self.marking_cell(self.tableWidget.currentRow())
                    # request for holding register changing
                    req = "write 0 " + str(self.tableWidget.currentRow()) + " " + \
                          self.tableWidget.cellWidget(self.tableWidget.currentRow(), 1).text()
                    self.cmd_list.append(req)

                def signal_cellchanged():
                    try:
                        self.tableWidget.cellWidget(self.tableWidget.currentRow(), 1).setStyleSheet(
                            "QLineEdit {background-color: Pink; font: 14pt;}"
                        )
                    except AttributeError: pass

                # connecting event to QLineEdit
                item.returnPressed.connect(signal_cellpressed)
                item.textChanged.connect(signal_cellchanged)
                self.tableWidget.setCellWidget(x, 1, item)
            # self.tableWidget.setColumnWidth(1,50)
            self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
            self.tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
            self.tableWidget.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
            self.tableWidget.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents)