Как очистить QV/QHBoxLayout от всех элементов?
Изначально все элементы добавляются из БД пользователя через for. То есть не имеют переменных.
При добавлении нового элемента нужно очистить старый список элементов, но мне это не удаётся сделать.
Пробовал так очищать BoxLayout, но получается какая то каша из новых и старых элементов:
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setMinimumSize(800, 500)
self.content = QFrame()
self.left_bar = QFrame()
self.left_bar.setStyleSheet('''
background-color: rgb(64,74,85);
''')
self.left_bar.setMinimumWidth(50)
self.left_bar.setMaximumWidth(50)
self.left_bar.setFrameShadow(QFrame.StyledPanel | QFrame.Raised)
self.vbox_1 = QVBoxLayout(self.left_bar)
self.vbox_1.setContentsMargins(0, 0, 0, 0)
self.right_bar = QFrame()
self.right_bar.setFrameShadow(QFrame.Raised)
self.hbox = QHBoxLayout(self)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.hbox.setSpacing(0)
self.hbox.addWidget(self.left_bar)
self.hbox.addWidget(self.right_bar)
self.sidebar()
def sidebar(self):
# вместо списка из бд засунул сюда список чисел по которым будут создаваться кнопки
# чтобы упростить код и не присваивать каждой итерации иконку из бд, имя кнопки и т.д.
self.sidebarDataList = [1, 2, 3]
for menuElement in self.sidebarDataList:
item = QPushButton()
item.setText(str(menuElement))
self.vbox_1.addWidget(item)
self.vbox_1.addStretch()
self.plusMenuButton = QPushButton()
self.plusMenuButton.setText("+")
self.vbox_1.addWidget(self.plusMenuButton)
self.plusMenuButton.clicked.connect(self.evt_plusItem)
# Здесь нужно очистить список из кнопок в BoxLayout и сгенерировать по новой
def evt_plusItem(self):
self.sidebarDataList.append(4)
countBoxMenu = self.vbox_1.count()
for i in range(countBoxMenu):
item = self.vbox_1.itemAt(i)
self.vbox_1.removeItem(item)
self.sidebar()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я не понимаю зачем вам нужно очистить старый список?
Попробуйте так:
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setMinimumSize(800, 500)
# ??? self.content = QFrame()
self.left_bar = QFrame()
self.left_bar.setStyleSheet('''
background-color: rgb(64,74,85);
''')
self.left_bar.setMinimumWidth(50)
self.left_bar.setMaximumWidth(50)
self.left_bar.setFrameShadow(QFrame.StyledPanel | QFrame.Raised)
self.vbox_1 = QVBoxLayout(self.left_bar)
self.vbox_1.setContentsMargins(0, 0, 0, 0)
self.right_bar = QFrame()
self.right_bar.setFrameShadow(QFrame.Raised)
self.label = QLabel(alignment=Qt.AlignCenter) # +
self.hbox_1 = QHBoxLayout(self.right_bar) # +
self.hbox_1.addWidget(self.label) # +
self.hbox = QHBoxLayout(self)
self.hbox.setContentsMargins(0, 0, 0, 0)
self.hbox.setSpacing(0)
self.hbox.addWidget(self.left_bar)
self.hbox.addWidget(self.right_bar)
# self.sidebar()
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.count_item = 0
self.sidebarDataList = [1, 2, 3]
for item in self.sidebarDataList:
self.sidebar(item)
self.vbox_1.addStretch()
self.plusMenuButton = QPushButton()
self.plusMenuButton.setText("+")
self.plusMenuButton.setStyleSheet('background-color: #B5FE83;')
self.plusMenuButton.clicked.connect(self.evt_plusItem)
self.vbox_1.addWidget(self.plusMenuButton)
def sidebar(self, item):
button = QPushButton()
button.setText(f'Button {item}')
button.setStyleSheet('background-color: #D98C00;')
button.clicked.connect(
lambda ch, btn=button: self.label.setText(f'Вы нажали кнопку: {btn.text()}'))
# self.vbox_1.addWidget(button)
self.vbox_1.insertWidget(self.count_item, button)
self.count_item += 1
def evt_plusItem(self):
self.sidebar(self.count_item+1)
self.label.clear()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
