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)