python - 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()
解决方案
您可以创建一个全新的单选按钮布局并将其设置为组框,而不是删除单选按钮,就像您在构造函数中所做的那样。这是一个示例,该函数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 时更新名称。前:
后:
推荐阅读
- sql - 查询生产耗时
- karate - 空手道:如何使用空手道验证复杂的 Api 响应?
- vue.js - 无法在 vuex 操作中传递多个参数
- python - Peewee - 我如何执行原始查询并将其映射到字典?
- python - 如何编写查询?
- python - 通过 google colab 上的网络摄像头从视频中实时抓取帧
- python - 如果列组合与 Panda Dataframe 相同,如何删除行
- php - 升级PHP和CakePHP(2.10.16)版本后数据库(MySql)新增字段不受影响
- javascript - 根据 Vue.js 中的其他组件名称做某事是一种好习惯吗?
- wordpress - 如何修复 wordpress 仪表板仅出现在 html 中