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)
Результат:


