Как в Qt Designer создать элемент с динамически меняющемся массивом данных?

Имеется приложение (не на PyQt5 Qt Designer), в котором при вводе в поле шаг автоматически заполняется столбец время, а при вводе в поле количество точек изменяется размерность таблицы.
А также имеется возможность заполнения столбца Выход данными.

Как можно реализовать данный функционал в PyQt5 Qt Designer ?

Пример окна приложения

введите сюда описание изображения

введите сюда описание изображения

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
import sys
import scipy
from PyQt5.QtWidgets import QLabel , QLineEdit
from scipy import integrate
from control.matlab import *
import control
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate
import scipy.optimize as opt

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1400, 900)
        MainWindow.setMinimumSize(QtCore.QSize(1400, 900))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setHorizontalSpacing(7)
        self.gridLayout.setVerticalSpacing(0)
        self.gridLayout.setObjectName("gridLayout")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setUnderline(False)
        font.setWeight(75)
        self.groupBox.setFont(font)
        self.groupBox.setInputMethodHints(QtCore.Qt.ImhNone)
        self.groupBox.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.groupBox.setFlat(False)
        self.groupBox.setCheckable(False)
        self.groupBox.setChecked(False)
        self.groupBox.setObjectName("groupBox")
        self.formLayoutWidget = QtWidgets.QWidget(self.groupBox)
        self.formLayoutWidget.setGeometry(QtCore.QRect(10, 60, 311, 188))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout_2 = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout_2.setContentsMargins(0, 0, 0, 0)
        self.formLayout_2.setHorizontalSpacing(6)
        self.formLayout_2.setVerticalSpacing(12)
        self.formLayout_2.setObjectName("formLayout_2")
        self.Label = QtWidgets.QLabel(self.formLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.Label.sizePolicy().hasHeightForWidth())
        self.Label.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.Label.setFont(font)
        self.Label.setObjectName("Label")
        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.Label)
        self.DoubleSpinBox = QtWidgets.QDoubleSpinBox(self.formLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.DoubleSpinBox.sizePolicy().hasHeightForWidth())
        self.DoubleSpinBox.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.DoubleSpinBox.setFont(font)
        self.DoubleSpinBox.setObjectName("DoubleSpinBox")
        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.DoubleSpinBox)
        self.Label_2 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.Label_2.setFont(font)
        self.Label_2.setObjectName("Label_2")
        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.Label_2)
        self.DoubleSpinBox_2 = QtWidgets.QDoubleSpinBox(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.DoubleSpinBox_2.setFont(font)
        self.DoubleSpinBox_2.setObjectName("DoubleSpinBox_2")
        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.DoubleSpinBox_2)
        self.Label_3 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.Label_3.setFont(font)
        self.Label_3.setObjectName("Label_3")
        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.Label_3)
        self.DoubleSpinBox_3 = QtWidgets.QDoubleSpinBox(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.DoubleSpinBox_3.setFont(font)
        self.DoubleSpinBox_3.setObjectName("DoubleSpinBox_3")
        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.DoubleSpinBox_3)
        self.Label_4 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.Label_4.setFont(font)
        self.Label_4.setObjectName("Label_4")
        self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.Label_4)
        self.SpinBox = QtWidgets.QSpinBox(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.SpinBox.setFont(font)
        self.SpinBox.setObjectName("SpinBox")
        self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.SpinBox)
        self.pushButton = QtWidgets.QPushButton(self.formLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
        self.pushButton.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(9)
        font.setBold(False)
        font.setItalic(False)
        font.setUnderline(True)
        font.setWeight(50)
        font.setStrikeOut(False)
        font.setKerning(False)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.SpanningRole, self.pushButton)
        self.gridLayoutWidget = QtWidgets.QWidget(self.groupBox)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 260, 311, 31))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setVerticalSpacing(10)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.label = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_2.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 1, 1, 1)
        self.horizontalLayout_4.addWidget(self.groupBox)
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.groupBox_2.setFont(font)
        self.groupBox_2.setFlat(False)
        self.groupBox_2.setObjectName("groupBox_2")
        self.layoutWidget = QtWidgets.QWidget(self.groupBox_2)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 60, 273, 201))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(10)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.rB1 = QtWidgets.QRadioButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setUnderline(True)
        font.setWeight(50)
        self.rB1.setFont(font)
        self.rB1.setObjectName("rB1")
        self.verticalLayout_2.addWidget(self.rB1)
        self.rB2 = QtWidgets.QRadioButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setUnderline(True)
        font.setWeight(50)
        self.rB2.setFont(font)
        self.rB2.setObjectName("rB2")
        self.verticalLayout_2.addWidget(self.rB2)
        self.rB3 = QtWidgets.QRadioButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setUnderline(True)
        font.setWeight(50)
        self.rB3.setFont(font)
        self.rB3.setObjectName("rB3")
        self.verticalLayout_2.addWidget(self.rB3)
        self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_2.setEnabled(True)
        font = QtGui.QFont()
        font.setPointSize(9)
        font.setBold(False)
        font.setUnderline(True)
        font.setWeight(50)
        font.setKerning(False)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout_2.addWidget(self.pushButton_2)
        self.horizontalLayout_4.addWidget(self.groupBox_2)
        self.gridLayout.addLayout(self.horizontalLayout_4, 2, 0, 1, 1)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.groupBox_3.setFont(font)
        self.groupBox_3.setObjectName("groupBox_3")
        self.widget = QtWidgets.QWidget(self.groupBox_3)
        self.widget.setGeometry(QtCore.QRect(0, 20, 501, 191))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth())
        self.widget.setSizePolicy(sizePolicy)
        self.widget.setObjectName("widget")
        self.horizontalLayout_3.addWidget(self.groupBox_3)
        self.gridLayout.addLayout(self.horizontalLayout_3, 4, 0, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
        self.label_3.setSizePolicy(sizePolicy)
        self.label_3.setMinimumSize(QtCore.QSize(0, 35))
        self.label_3.setMaximumSize(QtCore.QSize(16777215, 35))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        font.setKerning(False)
        self.label_3.setFont(font)
        self.label_3.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.label_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        font.setKerning(False)
        self.label_4.setFont(font)
        self.label_4.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.label_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_4.setFrameShadow(QtWidgets.QFrame.Raised)
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1400, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "Ввод кривой разгона"))
        self.Label.setText(_translate("MainWindow", "Входное воздействие:"))
        self.Label_2.setText(_translate("MainWindow", "Величина запаздывания:"))
        self.Label_3.setText(_translate("MainWindow", "Шаг"))
        self.Label_4.setText(_translate("MainWindow", "Количество точек:"))
        self.pushButton.setText(_translate("MainWindow", "Получить форму"))
        self.label.setText(_translate("MainWindow", "Время"))
        self.label_2.setText(_translate("MainWindow", "Выход"))
        self.groupBox_2.setTitle(_translate("MainWindow", "Тип разгоной характеристики"))
        self.rB1.setText(_translate("MainWindow", "Объект с самовыравниванием"))
        self.rB2.setText(_translate("MainWindow", "Объект без самовыравнивания"))
        self.rB3.setText(_translate("MainWindow", "Колебательный"))
        self.pushButton_2.setText(_translate("MainWindow", "Расчет коэффициента"))
        self.groupBox_3.setTitle(_translate("MainWindow", "Кривая разгона"))
        self.label_3.setText(_translate("MainWindow", "Идентификация объекта"))
        self.label_4.setText(_translate("MainWindow", "Расчет настроек регулятора"))

class MainWindow ( QtWidgets.QMainWindow , Ui_MainWindow ) :
    def __init__(self) :
        super ().__init__ ()
        self.setupUi ( self )

        #self.pushButton.clicked.connect ( self.kp )
        self.DoubleSpinBox.textChanged.connect ( self.kp )
        self.DoubleSpinBox_2.textChanged.connect ( self.td )
        self.pushButton_2.clicked.connect ( self.RB )

        self.DoubleSpinBox_3.valueChanged.connect(self.valStep )
        self.pushButton.clicked.connect ( self.myForm )

    def kp(self) :
        kp = self.DoubleSpinBox.text()
        #print(kp)
        return kp

    def td(self) :
        td = self.DoubleSpinBox_2.text()
        #print(td)
        return td

    def samovirav(self) :

        x_points = [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16]
        y_points = [0 , 0 , 0.125 , 0.3 , 0.45 , 0.55 , 0.65 , 0.725 , 0.8 , 0.85 , 0.89 , 0.91 , 0.95 , 0.96 , 0.975 ,0.985 , 1]

        plt.plot ( x_points ,  y_points )
        plt.grid ( True )
        plt.show ()

    def RB(self) :
        if self.rB1.isChecked () :
            self.samovirav ()

    def valStep(self , value) :
        pass
        # print(f"ObjectName: '{self.sender().objectName()}', Current Value: {value}")

    def myForm(self) :
        _step = self.DoubleSpinBox_3.value ()
        _points = self.SpinBox.value ()
        print ( f'step = {_step}, point = {_points}' )

        #Для удаления уже созданного массива
        countLayout = self.gridLayout.count ()
        if countLayout > 2 :
            for it in range ( countLayout - 2 ) :
                w = self.gridLayout.itemAt ( 2 ).widget ()
                self.gridLayout.removeWidget ( w )
                w.hide ()

        self.formWindow = []
        start_step = 0.00 # Начальная точка по времени
        for n in range ( _points ) : #определяет колличество точек
            _time = QLabel ( self )
            _time.setText ( f"{start_step:.2f}" )# Определяет количество знаковпосле запятой у времени
            out = QLineEdit ( '0.00' , self ) # Создает окна для ввода выхода с начальным значением 0.00
            self.gridLayout.addWidget ( _time , n + 1 , 0 , alignment=Qt.AlignCenter )
            self.gridLayout.addWidget ( out , n + 1 , 1 , alignment=Qt.AlignCenter )
            start_step += _step # Счетчик для создания временных переменных

            self.formWindow.append ( [_time , out] )#Завершение работы с виджетом


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow ()
    w.show ()
    sys.exit ( app.exec_ () )


Ответы (1 шт):

Автор решения: S. Nick

Я не знаю какое приложение у вас имеется.
Такой функционал нельзя сделать в Qt Designer.

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

import sys
from PyQt5.Qt import *


class DoubleSpinBox(QDoubleSpinBox):
    def __init__(self, obj):
        super().__init__()
        self.setObjectName(obj)
        self.setDecimals(3)         
        self.setMinimumWidth(100)
        self.setRange(0.000, 999.999)
        self.setSingleStep(1.000)
        
        self.valueChanged.connect(self.valChanged)

    def valChanged(self, value):  
        pass
        #print(f"ObjectName: '{self.sender().objectName()}', Current Value  {value:.2f}")
        

class Window(QWidget):
    def __init__(self):
        super().__init__()
        
        self.mainLayout = QVBoxLayout(self)
                
        self.frame_1 = QFrame()
        self.frame_1.setStyleSheet("QFrame {background: #cfdac8}")
        formLayout = QFormLayout(self.frame_1)
        self.input_action = DoubleSpinBox('input_action')
        self.lag_magnitude = DoubleSpinBox('lag_magnitude')
        self.step = DoubleSpinBox('step')
        self.amount_points = QSpinBox(valueChanged=self.valStep)
        self.amount_points.setObjectName('amount_points')
        self.btn_1 = QPushButton('Получить форму', clicked=self.myForm)
        
        formLayout.addRow('Входное воздействие:', self.input_action)
        formLayout.addRow('Величина запаздывания:', self.lag_magnitude)
        formLayout.addRow('Шаг:', self.step)
        formLayout.addRow('Количество точек:', self.amount_points)
        formLayout.addRow('', self.btn_1)
        self.mainLayout.addWidget(self.frame_1)
        
        self.frame_2 = QFrame()
        self.frame_2.setStyleSheet("QFrame {background: #e8eae6}")
        self.gridLayout = QGridLayout(self.frame_2)
        self.gridLayout.addWidget(QLabel('Время'), 0, 0, alignment=Qt.AlignCenter | Qt.AlignTop)
        self.gridLayout.addWidget(QLabel('Выход'), 0, 1, alignment=Qt.AlignCenter | Qt.AlignTop)
        self.gridLayout.setRowStretch(100, 1)
        self.mainLayout.addWidget(self.frame_2, 1)
        
        self.frame_3 = QFrame()
        self.frame_3.setStyleSheet("QFrame {background: #cdd0cb}")
        hLayout = QHBoxLayout(self.frame_3)
        self.btn_to_accept = QPushButton('Принять')        
        self.btn_print = QPushButton('Печать', clicked=self.form_print) 
        self.btn_close = QPushButton('Закрыть')
        hLayout.addWidget(self.btn_to_accept)
        hLayout.addWidget(self.btn_print)
        hLayout.addWidget(self.btn_close)
        self.mainLayout.addWidget(self.frame_3)
        
        self.formWidgets = []

    def valStep(self, value):
        pass
        #print(f"ObjectName: '{self.sender().objectName()}', Current Value: {value}")

    def myForm(self): 
        _step = self.step.value()
        _points = self.amount_points.value()
        print(f'step = {_step}, point = {_points}')
        
        countLayout = self.gridLayout.count()
        if countLayout > 2:
            for it in range(countLayout - 2):  
                w = self.gridLayout.itemAt(2).widget()
                self.gridLayout.removeWidget(w)     
                w.hide()

        self.formWidgets = []  
        start_step = 0.00
        for n in range(_points):
            _time = QLabel(self)
            _time.setText(f"{start_step:.2f}")
            out = QLineEdit('0.00', self)
            self.gridLayout.addWidget(_time, n+1, 0, alignment=Qt.AlignCenter)
            self.gridLayout.addWidget(out, n+1, 1, alignment=Qt.AlignCenter)
            start_step += _step
            
            self.formWidgets.append([_time, out])            

    def form_print(self):
        for row in self.formWidgets:
            print(f'  {row[0].text():>5} <---> {row[1].text()}')        
        
        
if __name__ == "__main__":
    application = QApplication(sys.argv)
    window = Window()
    window.resize(300, 500)
    window.show()
    sys.exit(application.exec_())        

введите сюда описание изображения

→ Ссылка