Как удалить все виджеты в QGroupBox в PyQt5?

В моей программе отображается QGroupBox, внутри которого много QPushButton. Во время выполнения программы пользователь может щелкнуть кнопку за пределами QGroupBox, и все кнопки внутри нее будут удалены или скрыты. Проблема в том, что я не могу найти способ сделать это с кнопками напрямую или с помощью очистки QGroupBox.

Я уже пробовал deleteLater на кнопках, но это не сработало. Затем я попытался очистить layout из QGroupBox, но это тоже не сработало. Вот некоторый код, который я только что написал, имеет ту же проблему:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import random

class UI_Dialog(object):
    def addButtons(self,looping):

        # Code to remove the previous QPushButton's goes here.

        placement = -100
        for i in range(looping):
            currentName = 'btn' + str(i)
            placement = placement + 110
            self.btnB = QtWidgets.QPushButton(self.groupBox)         
            self.btnB.setGeometry(QtCore.QRect(10+placement, 30+placement, 100, 100))
            self.btnB.show()
            self.btnB.setObjectName(currentName)
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(1300, 800)
        self.btnA = QtWidgets.QPushButton(Dialog)
        self.btnA.setGeometry(QtCore.QRect(10, 80, 101, 131))
        self.btnA.setObjectName("btn1")
        self.btnA.clicked.connect(self.pushed)
        self.formLayout = QtWidgets.QFormLayout()
        self.groupBox = QtWidgets.QGroupBox("Results")
        self.groupBox.setLayout(self.formLayout)
        self.resultScrollArea = QtWidgets.QScrollArea(Dialog)
        self.resultScrollArea.setWidget(self.groupBox)
        self.resultScrollArea.setGeometry(QtCore.QRect(20, 220, 1011, 531))
        self.resultScrollArea.setWidgetResizable(True)
        self.resultScrollArea.setObjectName("resultScrollArea")     
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def pushed(self):
        unkownLength = random.randint(1,20)
        self.addButtons(unkownLength)
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Example Program"))
        self.btnA.setText(_translate("Dialog", "Push Button"))

app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = UI_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())

Здесь есть вещи, которые, вероятно, не имеют смысла, такие как размер окна, множественные вызовы функций или диалоговое окно вместо QMainWindow. Однако в контексте реальной программы они имеют смысл, поэтому просто игнорируйте это, я знаю, что это неэффективно. Кроме того, весь смысл переменной unkownLength заключается в том, чтобы эмулировать, что в реальной программе количество сгенерированных кнопок будет определяться пользовательским вводом. Кнопок также не должно быть в начале, поэтому они создаются нажатием кнопки. При повторном нажатии кнопки она должна удалить или скрыть все ранее созданные кнопки. Есть идеи?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 073
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Воспользовавшись тем, что кнопки являются дочерними элементами QGroupBox, мы можем заставить кнопки использовать findChildren() для использования deleteLater():

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import random


class UI_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(1300, 800)
        self.btnA = QtWidgets.QPushButton(Dialog)
        self.btnA.setGeometry(QtCore.QRect(10, 80, 101, 131))
        self.btnA.setObjectName("btn1")

        self.formLayout = QtWidgets.QFormLayout()
        self.groupBox = QtWidgets.QGroupBox("Results")
        self.groupBox.setLayout(self.formLayout)
        self.resultScrollArea = QtWidgets.QScrollArea(Dialog)
        self.resultScrollArea.setWidget(self.groupBox)
        self.resultScrollArea.setGeometry(QtCore.QRect(20, 220, 1011, 531))
        self.resultScrollArea.setWidgetResizable(True)
        self.resultScrollArea.setObjectName("resultScrollArea")
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Example Program"))
        self.btnA.setText(_translate("Dialog", "Push Button"))


class Dialog(QtWidgets.QDialog, UI_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.btnA.clicked.connect(self.pushed)

    @QtCore.pyqtSlot()
    def pushed(self):
        unkownLength = random.randint(1, 20)
        self.addButtons(unkownLength)

    def addButtons(self, looping):
        for button in self.groupBox.findChildren(QtWidgets.QPushButton):
            button.deleteLater()
        placement = -100
        pos = QtCore.QPoint(20, 40)
        for i in range(looping):
            currentName = "btn" + str(i)
            self.btnB = QtWidgets.QPushButton(
                self.groupBox, objectName=currentName
            )
            self.btnB.setGeometry(QtCore.QRect(pos, QtCore.QSize(100, 100)))
            pos += QtCore.QPoint(110, 110)
            self.btnB.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())

Другие вопросы по теме