Проблема замена одного виджета на другой в 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())