Динамическое создание виджетов
Задача состоит в том, чтобы динамически добавлять пары виджетов
например, 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())