我有一个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()
代替删除单选按钮,您可以创建一个全新的单选按钮布局,并完全按照在构造函数中的设置为组框设置它。这是一个示例,其中函数set_group_box_buttons
将从radio_group_box
中删除现有布局(通过将其设置为temp小部件来完成),并使用新按钮添加一个新布局。]
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键时,它将更新名称。之前:
之后: