I'm building a layout in pyqt5 where you can dynamically add or delete widgets. Below you can see a simplified version of my problem: after the successful deleting of the nested layout "nested_hbox" and its widgets it won't build up again and just shows an empty window.
Edit: In my real application I have a grid layout where you can dynamically add diagrams in shape of a matrix to view multiple incoming values from an interface. For that you can quantify the number of rows and columns. So, the grid must be refreshed, when the user actuates a button.
import sys
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.layouts = []
self.main_content_ui()
self.init_ui()
def main_content_ui(self):
"""Build up content for the main layout "vbox" """
self.lbl_hello = QLabel()
self.lbl_hello.setObjectName("lbl_hello")
self.lbl_hello.setText("Hello StackOverflow")
self.btn_reset_ui = QPushButton()
self.btn_reset_ui = QPushButton()
self.btn_reset_ui.setObjectName("btn_reset_ui")
self.btn_reset_ui.clicked.connect(self.reset_ui)
self.btn_reset_ui.setText("Reset UI")
self.nested_hbox = QHBoxLayout()
self.nested_hbox.setObjectName("nested_hbox")
self.nested_hbox.addWidget(self.lbl_hello)
self.nested_hbox.addWidget(self.btn_reset_ui)
self.layouts.append(self.layouts)
# main layout
self.vbox = QVBoxLayout()
self.vbox.setObjectName("vbox_main")
self.layouts.append(self.vbox)
self.vbox.addLayout(self.nested_hbox)
def init_ui(self):
"""Set "vbox" as main layout
"""
self.setLayout(self.vbox)
self.show()
def delete_layout(self, layout):
"""Delete all layouts from list "layouts"
"""
try:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget is not None:
widget.deleteLater()
else:
self.delete_layout(item.layout())
except Exception as e:
print(e)
def reset_ui(self):
"""Clear and reinitalize main layouts content"""
for lay in self.layouts:
self.delete_layout(lay)
print("Layout deleted rebuild layout")
self.main_content_ui()
self.vbox.update()
QMainWindow.update(self)
app = QApplication(sys.argv)
ex = Window()
sys.exit(app.exec_())
I expect the same Window as before clicking the reset-button but the window doesn't show anything.