QTableWidget – автоматическая ячейка, управляемая формулой

Можно ли сделать ячейку ячейкой, управляемой формулой, и обновить ее автоматически? Как и Excel.

Например, я хочу, чтобы пользователь заполнил две ячейки, а затем третья ячейка автоматически разделится, когда пользователь заполняет обе ячейки. Я бы хотел, чтобы он НЕ подключался к кнопке.

  • Использование функций панели задач Windows 7 в PyQt
  • Как фильтровать элементы PyQt QCombobox на основе ввода текста?
  • Индикатор выполнения PyQt не обновляется или появляется до 100%
  • Как правильно использовать QThread в pyqt с moveToThread ()?
  • Сделать обратные диагонали белыми в тепловой карте
  • PyQt QFileDialog - выбор нескольких каталогов
  • Скриншот QTable

    Код для TableWidget:

    self.tableWidget = {} for i in range(int(self.numberLine.text())): self.tableWidget[i] = QTableWidget() self.tableWidget[i].setRowCount(5) self.tableWidget[i].setColumnCount(3) self.tableWidget[i].setHorizontalHeaderLabels(['OEM (Case {})'.format(i+1), 'ZVI (Case {})'.format (i+1), 'Improvement % ']) self.tableWidget[i].setVerticalHeaderLabels(['Flow (MMSCFD)', 'HP', 'Specific Power (HP/MMSCFD)', 'Discharge Temp (F)', '']) self.tableWidget[i].setFixedSize(QtCore.QSize(480, 180)) self.gridLayout_14.addWidget(self.tableWidget[i]) 

  • Пример правильного способа использования QThread в PyQt?
  • Связывание файла .ui с qtDesigner с python / pyqt?
  • Передача аргумента при запуске нового QThread () в PyQt
  • Заполнение формы с использованием PyQt и QWebview
  • Почему этот код только переключает синий цвет? (Python, PyQt)
  • PyQt4, QThread и открытие больших файлов без замораживания GUI
  • 2 Solutions collect form web for “QTableWidget – автоматическая ячейка, управляемая формулой”

    Элегантным решением является создание настраиваемого класса, который наследуется от QTableWidget , где вы подключаете сигнал itemChanged , который выдается каждый раз, когда ячейка меняет значение (это возвращает измененный элемент, но будет использовать его только для проверки того, что столбцы по умолчанию являются теми, были изменены).

    В дополнение к тому, что пользователи не помещают разные значения в плавающие, мы будем использовать QDoubleValidator, для чего мы создаем пользовательский QItemDelegate.

     class FloatDelegate(QItemDelegate): def __init__(self, _from, _to, _n_decimals, parent=None): QItemDelegate.__init__(self, parent=parent) self._from = _from self._to = _to self._n_decimals = _n_decimals def createEditor(self, parent, option, index): lineEdit = QLineEdit(parent) _n_decimals = 2 validator = QDoubleValidator(self._from, self._to, self._n_decimals, lineEdit) lineEdit.setValidator(validator) return lineEdit class CustomTableWidget(QTableWidget): _from = 0 _to = 10**5 _n_decimals = 2 def __init__(self, i, parent=None): QTableWidget.__init__(self, 5, 3, parent=parent) self.setItemDelegate(FloatDelegate(self._from, self._to, self._n_decimals, self)) self.setHorizontalHeaderLabels(['OEM (Case {})'.format(i+1), 'ZVI (Case {})'.format (i+1), 'Improvement % ']) self.setVerticalHeaderLabels(['Flow (MMSCFD)', 'HP', 'Specific Power (HP/MMSCFD)', 'Discharge Temp (F)', '']) self.setFixedSize(QSize(480, 180)) self.itemChanged.connect(self.onItemChanged) def onItemChanged(self, item): # items (2, 0) = (1, 0) / (0, 0) if item.column() == 0 and (item.row() == 0 or item.row()==1): num = self.item(1, 0) den = self.item(0, 0) if num and den: resp = float(num.data(Qt.DisplayRole))/float(den.data(Qt.DisplayRole)) rest_string = str(round(resp, self._n_decimals)) it = QTableWidgetItem(rest_string, QTableWidgetItem.Type) self.setItem(2, 0, it) 

    Пример:

     class Widget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent=parent) self.setLayout(QGridLayout()) for i in range(2): self.layout().addWidget(CustomTableWidget(i)) if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Widget() window.show() sys.exit(app.exec_()) 

    В твоем случае:

     self.tableWidget = {} for i in range(int(self.numberLine.text())): self.tableWidget[i] = CustomTableWidget(i) self.gridLayout_14.addWidget(self.tableWidget[i]) 

    Другой вариант вместо использования валидаторов, мы можем изменить QLineEdit на QDoubleSpinBox.

     def createEditor(self, parent, option, index): w = QDoubleSpinBox(parent) _n_decimals = 2 w.setMinimum(self._from) w.setMaximum(self._to) w.setDecimals(self._n_decimals) return w 

    Подключите ячейку к другим ячейкам. Редактирование финишного сигнала.

    Python - лучший язык программирования в мире.