Как обновить контейнер в PyQt5?(Python3)
Я хотел научиться обновлять контейнеры модуля PyQt5.
Нашел метод repaint(), но, как я понял, ему необходимы координаты области, которую нужно обновить. Т.к. я не планировал использовать абсолютное позиционирование, мне это не подходит.
Есть ли способ обновить конкретный контейнер? Пожалуйста, подскажите, как это сделать на примере нажатия на кнопку(я хочу обновлять контейнер при нажатии на кнопку)?
from PyQt5 import QtCore, QtWidgets, QtGui
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.box = QtWidgets.QHBoxLayout()
self.setLayout(self.box)
self.button1 = QtWidgets.QPushButton('Button')
self.button1.clicked.connect(self.click)
self.button2 = QtWidgets.QPushButton('Button')
self.box.addWidget(self.button1)
self.box.addWidget(self.button2)
def click(self):
pass
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Чтобы удалить виджеты из контейнера (с установленным layout) надо делать так:
def click(self):
count = self.layout().count()
# Идем с конца
for i in range(count-1, -1, -1):
layoutItem = self.layout().itemAt(i)
# Если лейаутИтем отвечает за виджет, то
# метод widget() вернет этот widget, иначе None
w = layoutItem.widget()
if w:
self.layout().removeWidget(w)
# Теперь надо убрать родителя из виджета
w.setParent(None)
# И удалить сам виджет
w.deleteLater()
# Если же вам надо удалить вообще все элементы,
# включая другие лейауты, то
else:
self.layout().removeItem(layoutItem)
# Теперь ваш контейнер девственно чист
Если layout не установлен, а виджеты удалить надо, то вспоминаем, что все виджеты являются наследниками QObject, у которого, в свою очередь есть метод children(), тогда:
for child in self.children():
# Например, проверим, что child это QWidget
if isinstance(child, QWidget):
child.setParent(None)
child.deleteLater()