Проблема замена одного виджета на другой в PyQt6

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

Вот пример кода.

import sys
from PyQt6 import QtCore, QtGui, QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Разноцветная сетка")
        self.resize(600, 480)

        # Создание центрального виджета
        self.central_widget = QtWidgets.QWidget(self)
        self.central_widget.setGeometry(1, 1, 600, 400)

        # создание кнопки для изменения виджета
        self.button = QtWidgets.QPushButton(self)
        self.button.setText("Change")
        self.button.setGeometry(100, 400, 400, 50)
        self.button.clicked.connect(self.change_vbox)

        # Создание сетки
        self.grid_layout = QtWidgets.QGridLayout()
        self.grid_layout1 = QtWidgets.QGridLayout()
        self.central_widget.setLayout(self.grid_layout)

        # Добавление цветных виджетов в сетку
        for i in range(3):
            for j in range(3):
                color = QtGui.QColor.fromHsv(i * 40, 255, 255)
                widget = QtWidgets.QWidget()
                widget.setStyleSheet(f"background-color: {color.name()};")
                self.grid_layout.addWidget(widget, i, j)

        # вторая сетка
        for i in range(3):
            for j in range(3):
                color = QtGui.QColor.fromHsv(i * 10, 255, 255)
                widget = QtWidgets.QPushButton()
                widget.setStyleSheet(f"background-color: {color.name()};")
                self.grid_layout1.addWidget(widget, i, j)

    def change_vbox(self):
        self.central_widget.setLayout(self.grid_layout1)
        # Добавление вызова update() для перерисовки виджета
        self.central_widget.update()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

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

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

Обычно для таких целей используют QStackedWidget Class.

Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.

import sys
#from PyQt6 import QtCore, QtGui, QtWidgets                         # PyQt6
from PyQt5 import QtCore, QtGui, QtWidgets                          # PyQt5


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        # Создание центрального виджета
        self.central_widget = QtWidgets.QWidget(self)
# ?      self.central_widget.setGeometry(1, 1, 600, 400)
        self.setCentralWidget(self.central_widget)                  # !!! +++ 

        self.stacked_widget = QtWidgets.QStackedWidget()            # +++ 
        self.stack1 = self.widget_1()
        self.stacked_widget.addWidget(self.stack1)
        self.stack2 = self.widget_2()
        self.stacked_widget.addWidget(self.stack2)

        # создание кнопки для изменения виджета
        self.button = QtWidgets.QPushButton(self)
        self.button.setText("Change")
        self.button.clicked.connect(self.change_vbox)
        self.button.setCheckable(True)                              # +++

        # Создание сетки
        self.layout = QtWidgets.QVBoxLayout(self.central_widget)    # +
        self.layout.addWidget(self.stacked_widget)
        self.layout.addWidget(self.button)     

    def widget_1(self):
        widget1 = QtWidgets.QWidget()
        grid_layout = QtWidgets.QGridLayout(widget1)
        # Добавление цветных виджетов в сетку
        for i in range(3):
            for j in range(3):
                color = QtGui.QColor.fromHsv(i * 40, 255, 255)
                widget = QtWidgets.QWidget()
                widget.setStyleSheet(f"background-color: {color.name()};")
                grid_layout.addWidget(widget, i, j)
        return widget1
                
    def widget_2(self):
        widget2 = QtWidgets.QWidget()
        grid_layout = QtWidgets.QGridLayout(widget2)
        # вторая сетка
        for i in range(3):
            for j in range(3):
                color = QtGui.QColor.fromHsv(i * 10, 255, 255)
                widget = QtWidgets.QPushButton()
                widget.setStyleSheet(f"background-color: {color.name()};")
                grid_layout.addWidget(widget, i, j)
        return widget2
        
    def change_vbox(self, state):
        #print(state)    
        if state:
            self.stacked_widget.setCurrentIndex(1)
        else:
            self.stacked_widget.setCurrentIndex(0)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.setWindowTitle("Разноцветная сетка")
    window.resize(600, 480)
    window.show()
    sys.exit(app.exec())

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

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

→ Ссылка