PyQt5. Выбор GroupBox по сигналу от кнопки

В продолжение Изменение размеров фреймов во вкладке, начал разбираться с обработкой сигналов.

Идея состоит в том что при нажатии на кнопку Task1 - фрейм Welcoмe (class Welcome(QGroupBox)) меняется на фрейм Task1 (class Task1(QGroupBox)), Task2 -> фрейм Task2 и т.д.

Во время обработки сигналов от кнопок столкнулся с проблемами поэтому кнопки перенес в класс Tab1. Когда-то я уже сталкивался с подобной проблемой в Tkinter и в качестве решения можно было использовать метод destroy, очевидно, что данный метод тут работать не будет (и не работает).

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

import sys
from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import (
    QMainWindow, QWidget, QGridLayout,
    QHBoxLayout, QVBoxLayout, QApplication,
    QTabWidget, QPushButton, QGroupBox, QLabel
)

MAIN_APP_HEIGHT = 400
MAIN_APP_WIDTH = 700


class Tab1(QWidget):
def __init__(self, parent=None):
    super().__init__(parent)

    self.cucm_tasks = Welcome()

    self.button_task1 = QPushButton("Task1")
    self.button_task1.clicked.connect(self.change_task)
    self.button_task2 = QPushButton("Task2")
    self.button_task2.clicked.connect(self.change_task)

    self.widgit_box = QVBoxLayout()
    self.widgit_box.addWidget(self.button_task1)
    self.widgit_box.addWidget(self.button_task2)
    self.widgit_box.addStretch(1)

    self.task_box = QGroupBox()
    self.task_box.setTitle("&Tasks")
    self.task_box.setLayout(self.widgit_box)

    self.grid_layout = QHBoxLayout(self)
    self.grid_layout.addWidget(self.task_box, stretch=1)
    self.grid_layout.addWidget(self.cucm_tasks, stretch=5)

@pyqtSlot()
def change_task(self):

    action = self.sender()
    print(action.text())
    self.cucm_tasks.destroy()  # Не работает, хотя и ошибку не кидает.
    if action.text() == "Task1":
        self.cucm_tasks = Task1()
    elif action.text() == "Task2":
        self.cucm_tasks = Task2()
    self.grid_layout.addWidget(self.cucm_tasks, stretch=5)


class Task1(QGroupBox):
    def __init__(self, parent=None):
        super(Task1, self).__init__(parent)
        self.setTitle("&Task1")
        pass


class Task2(QGroupBox):
    def __init__(self, parent=None):
        super(Task2, self).__init__(parent)
        self.setTitle("&Task2")
        pass


class Welcome(QGroupBox):
    def __init__(self, parent=None):
        super(Welcome, self).__init__(parent)
        self.setTitle("&Welcome")
        self.grid_layout = QGridLayout(self)
        self.grid_layout.addWidget(
            QLabel("<h1>Welcome</h1>"), 0, 0, Qt.AlignCenter)


class MainApplication(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.resize(MAIN_APP_WIDTH, MAIN_APP_HEIGHT)
        self.setWindowTitle("App")

        tab1 = Tab1()

        self.main_tabs = QTabWidget()
        self.main_tabs.addTab(tab1, "Tab 1")
        self.main_tabs.addTab(QLabel('Hello world'), "Tab 2")

        grid_layout = QGridLayout(self.centralWidget)
        grid_layout.addWidget(self.main_tabs)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainApplication()
    ex.show()
    sys.exit(app.exec_())

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

Автор решения: gil9red

Вместо destroy можно использовать deleteLater

    @pyqtSlot()
    def change_task(self):
        action = self.sender()
        print(action.text())

        self.cucm_tasks.deleteLater()

        if action.text() == "Task1":
            self.cucm_tasks = Task1()
        elif action.text() == "Task2":
            self.cucm_tasks = Task2()
        self.grid_layout.addWidget(self.cucm_tasks, stretch=5)

Результат:

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

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

→ Ссылка