Динамическое создание виджетов

Задача состоит в том, чтобы динамически добавлять пары виджетов например, QLabel и QLineEdit в интерфейс.
Я создал класс - обёртку QMixedWidget, содержащий в себе другие виджеты.

class QMixedWidget(QWidget):
    def __init__(self, parent=None, *widgets):
        super().__init__(parent)
        self._widgets = widgets

    def paintEvent(self, event: PySide6.QtGui.QPaintEvent) -> None:
        for w in self._widgets:
            w.paintEvent(event)
        super().paintEvent(event)

    def update(self) -> None:
        for w in self._widgets:
            w.update()
        super().update()

Но при попытке добавить созданный виджет на Layout ничего не происходит, возможно следует переопределить еще какие-то методы?

def _add_n_action(self):
   label = QLabel("Источник шума L")
   value = QLineEdit("0")
   w = QMixedWidget(self.add_group_box, label, value)
   self.add_layout.addWidget(w)

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

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

Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

Если я вас правильно понял, то ваша задача может выглядеть примерно так.
Установите свои импорты для PySide6 и попробуйте:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        
        self.cont = 0
        
        self.scroll = QtWidgets.QScrollArea()
        self.scroll.setWidgetResizable(True)
        self.scroll_widget = QtWidgets.QWidget()
        self.element_widget = QtWidgets.QWidget()
        vbox = QtWidgets.QVBoxLayout(self.scroll_widget)
        vbox.setContentsMargins(0, 0, 0, 0)
        vbox.addWidget(self.element_widget)
        vbox.addStretch()

        self.scroll.setWidget(self.scroll_widget)
        self.layout = QtWidgets.QGridLayout(self.element_widget)

        self.btn = QPushButton('Добавить')
        self.btn.clicked.connect(self._add_n_action)
        
        self.main_layout = QVBoxLayout(self)
        self.main_layout.addWidget(self.scroll)
        self.main_layout.addWidget(self.btn)

    def _add_n_action(self):
        num_element = self.layout.rowCount() 
        
        frame = QFrame(objectName='frame')
        label = QLabel(f'Источник шума L{self.cont}')
        lineEdit = QLineEdit("0")
        buttonErase = QPushButton('X')
        buttonErase.setMinimumSize(30, 30)                 
        buttonErase.clicked.connect(
            lambda ch, w=frame: self._del(w))

        hbox = QHBoxLayout(frame)
        hbox.addWidget(label)
        hbox.addWidget(lineEdit)
        hbox.addWidget(buttonErase)

        self.layout.addWidget(frame, num_element, 0)
        self.cont += 1

    def _del(self, w):
        w.deleteLater()


Stylesheet = '''
QFrame QPushButton {
    border: 2 solid red; 
    border-radius: 15px;
    background: rgba(255, 181, 0, 0.5);
}
#frame {
    border: 2 solid blue; 
    border-radius: 5px;
}                
'''
    

if __name__ == "__main__":
    import sys
    
    app = QApplication(sys.argv)
    app.setStyleSheet(Stylesheet) 
    window = MainWindow()
    window.resize(300, 300)
    window.show()
    sys.exit(app.exec())

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

→ Ссылка