首页 > 解决方案 > PyQt5:如何重置 QtWidgets.QGroupBox 的内容

问题描述

我有一个RadioButtonWidget类接收名称列表 ( button_list) 和QtWidgets.QGroupBox( radio_group_box) 并为每个名称创建一个单选按钮。我遇到的问题是,在创建按钮后,我无法更改它们。也就是说,如果我用另一个名称列表再次调用该类,则没有任何变化。我需要在我的类中创建一个函数来删除任何现有的单选按钮,以便我可以在其中添加一个新列表。

我试图radio_group_box.deleteLater()在课外做,但这会删除整个盒子。

class RadioButtonWidget(QtWidgets.QWidget):
    def __init__(self, radio_group_box, button_list):
        super().__init__()
        self.radio_group_box = radio_group_box
        self.radio_button_group = QtWidgets.QButtonGroup()

        #create the radio buttons
        self.radio_button_list = []
        for each in button_list:
            self.radio_button_list.append(QtWidgets.QRadioButton(each))

        if button_list != []:
            #set the default checked item
            self.radio_button_list[0].setChecked(True)

        #create layout for radio buttons and add them
        self.radio_button_layout = QtWidgets.QVBoxLayout()

        # add buttons to the layout and button group
        counter = 1
        for each in self.radio_button_list:
            self.radio_button_layout.addWidget(each)
            self.radio_button_group.addButton(each)
            self.radio_button_group.setId(each,counter)
            counter += 1

        # add radio buttons to the group box
        self.radio_group_box.setLayout(self.radio_button_layout)

    def selected_button(self):
        return self.radio_button_group.checkedId()

标签: pythonpyqtpyqt5

解决方案


您可以创建一个全新的单选按钮布局并将其设置为组框,而不是删除单选按钮,就像您在构造函数中所做的那样。这是一个示例,该函数set_group_box_buttons将从中删除现有布局radio_group_box(通过将其设置为临时小部件来完成),并使用新按钮添加一个新布局。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class RadioButtonWidget(QWidget):

    def __init__(self, radio_group_box, button_list):
        super().__init__()
        self.radio_group_box = radio_group_box
        self.set_group_box_buttons(button_list)

        grid = QGridLayout(self)
        grid.addWidget(self.radio_group_box)

    def selected_button(self):
        return self.radio_button_group.checkedId()

    def set_group_box_buttons(self, button_list):
        self.radio_button_group = QButtonGroup()
        self.radio_button_list = [QRadioButton(x) for x in button_list]
        if button_list:
            self.radio_button_list[0].setChecked(True)

        if self.radio_group_box.layout():
            QWidget().setLayout(self.radio_group_box.layout())

        self.radio_button_layout = QVBoxLayout()
        for i, v in enumerate(self.radio_button_list):
            self.radio_button_layout.addWidget(v)
            self.radio_button_group.addButton(v)
            self.radio_button_group.setId(v, i)
        self.radio_group_box.setLayout(self.radio_button_layout)


class Template(QWidget):

    def __init__(self):
        super().__init__()
        self.rbw = RadioButtonWidget(QGroupBox('Radio Buttons'), ['Radio 1', 'Radio 2', 'Radio 3'])
        self.box = QLineEdit()
        self.box.returnPressed.connect(self.replace_buttons)
        grid = QGridLayout(self)
        grid.addWidget(self.rbw, 0, 0)
        grid.addWidget(self.box, 0, 1)

    def replace_buttons(self):
        self.rbw.set_group_box_buttons(self.box.text().split(', '))


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

为了演示,我添加了一个 QLineEdit,它会在您按 Enter 时更新名称。前:

在此处输入图像描述

后:

在此处输入图像描述


推荐阅读