Замените флажки в соответствии с опцией, выбранной в QCombobox
Я пытаюсь автоматически заполнить список эксклюзивных флажков, где количество флажков изменяется в соответствии с параметром, выбранным в QComboBox.
Я застрял в части, как удалить первоначально добавленные виджеты в макете и заменить их новыми виджетами.
Например, если пункт меню -food
будет выбран 3 флажка ('good2eat', 'macs', 'popeyes'), и если drinks
Если флажок установлен, эти три флажка будут удалены и заменены на варианты "вода", "чай".
class MenuWindow(QtGui.QWidget):
def __init__(self, dict_items, parent=None):
super(MenuWindow, self).__init__(parent=parent)
layout = QtGui.QVBoxLayout()
self.checkbox_options = {}
self.menu_tag_dict = defaultdict(set)
self.menu_combos = QtGui.QComboBox()
self.menu_combos.currentIndexChanged.connect(self.get_selections)
self.chkbox_group = QtGui.QButtonGroup()
for menu_name, submenu_name in dict_items.items():
self.menu_combos.addItems([menu_name])
if submenu_name:
sub_txt = [m for m in submenu_name]
for s in sub_txt:
sub_chk = QtGui.QCheckBox(s)
self.checkbox_options[menu_name] = sub_chk
self.chkbox_group.addButton(sub_chk)
print_btn = QtGui.QPushButton('Print selected')
layout.addWidget(self.menu_combos)
for s in self.checkbox_options.values():
layout.addWidget(s)
layout.addWidget(get_sel_btn)
layout.addStretch()
self.setLayout(layout)
self.show()
def get_selections(self):
# Get combobox text
combo_text = self.menu_combos.currentText()
# get the menus
items = self.menu_combos.get(combo_text)
my_items = {
'food' : ['good2eat', 'macs', 'popeyes'],
'drinks': ['water', 'tea']
}
myWin = MenuWindow(my_items)
myWin.show()
Тем не менее, в начале кода, количество опций, заполненных под пунктом меню food
уже неправильно.
Есть ли лучший способ, которым я могу справиться с этим??
1 ответ
Попытайся:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MenuWindow(QWidget):
def __init__(self, dict_items, parent=None):
super(MenuWindow, self).__init__(parent=parent)
self.dict_items = dict_items
self.menu_combos = QComboBox()
self.menu_combos.currentIndexChanged[str].connect(self.get_selections)
self.menu_combos.addItems(sorted(self.dict_items.keys()))
print_btn = QPushButton('Print selected') # ! Print selected
print_btn.clicked.connect(self.printSelected) # ! Print selected
self.layoutV = QVBoxLayout()
self.layoutV.addWidget(self.menu_combos)
for s in self.dict_items[self.menu_combos.currentText()]:
self.sub_chk = QCheckBox(s)
self.layoutV.addWidget(self.sub_chk)
self.layoutV.addStretch()
self.layoutV.addWidget(print_btn) # ! Print selected
self.setLayout(self.layoutV)
self.show()
@pyqtSlot(str)
def get_selections(self, text):
if self.layout():
countLayout = self.layout().count()
for it in range(countLayout - 3): # <--- removeWidget
w = self.layout().itemAt(1).widget()
self.layout().removeWidget(w)
w.hide()
for s in self.dict_items[text][::-1]: # <--- insertWidge
self.sub_chk = QCheckBox(s)
self.layoutV.insertWidget(1, self.sub_chk)
def printSelected(self): # ! Print selected
checked_list = []
for i in range(1, self.layoutV.count() - 2):
chBox = self.layoutV.itemAt(i).widget()
if chBox.isChecked():
checked_list.append(chBox.text())
print("selected QCheckBox: " + str(list(checked_list)))
my_items = {
'food' : ['good2eat', 'macs', 'popeyes'],
'drinks': ['water', 'tea']
}
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
myWin = MenuWindow(my_items)
myWin.setGeometry(300, 150, 250, 250)
myWin.show()
sys.exit(app.exec_())