Активация QComboBox при уставке флага на QCheckBox
Вопрос в заголовке, но есть небольшое уточнение: пар combobox и checkbox несколько. Самое простое это написать обработчик для каждой пары. Но можно ли передавать их в функцию не привязанную к конкретной паре?
к примеру:
self.checkBox.clicked.connect(self.comboBox.setEnabled(self.check_flag(self.checkBox.isChecked())))
def check_flag(self, chd):
if chd is True:
return True
else:
return False
минимальная форма:
form.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_F03_FORM(object):
def setupUi(self, F03_FORM):
F03_FORM.setObjectName("F03_FORM")
F03_FORM.resize(745, 450)
F03_FORM.setMinimumSize(QtCore.QSize(745, 450))
F03_FORM.setMaximumSize(QtCore.QSize(745, 768))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(10)
F03_FORM.setFont(font)
self.comboBox = QtWidgets.QComboBox(F03_FORM)
self.comboBox.setMinimumSize(QtCore.QSize(470, 24))
self.comboBox.setObjectName("comboBox")
self.horizontalLayout_2.addWidget(self.comboBox)
self.checkBox = QtWidgets.QCheckBox(F03_FORM)
self.checkBox.setMinimumSize(QtCore.QSize(170, 24))
self.checkBox.setMaximumSize(QtCore.QSize(16777215, 16777213))
self.checkBox.setObjectName("checkBox")
self.buttonBox.setFont(font)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.gridLayout_2.addWidget(self.buttonBox, 4, 1, 1, 1)
self.retranslateUi(F03_FORM)
self.buttonBox.accepted.connect(F03_FORM.accept) # type: ignore
self.buttonBox.rejected.connect(F03_FORM.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(F03_FORM)
def retranslateUi(self, F03_FORM):
_translate = QtCore.QCoreApplication.translate
F03_FORM.setWindowTitle(_translate("F03_FORM", "Ф03"))
self.checkBox.setText(_translate("F03_FORM", "F"))
form_func.py
from PyQt5.QtWidgets import QDialog, QCheckBox
from PyQt5.QtCore import QDate, Qt
from form import Ui_F03_FORM
class F03_win(QDialog, Ui_F03_FORM):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.setupUi(self)
self.comboBox.setEnabled(False)
self.checkBox_2.clicked.connect(self.comboBox_3.setEnabled(self.check_flag(self.checkBox_2.isChecked())))
def check_flag(self, chd):
if chd is True:
return True
else:
return False
def start_win_03():
f03_win = F03_win()
f03_win.exec_()
обрезал как мог, надеюсь получилось
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Такой вариант:
def __init__(self, parent=None):
...
self.checkBox1 = QCheckBox()
self.checkBox1.setEnabled(False)
self.checkBox2 = QCheckBox()
self.checkBox3 = QCheckBox()
...
self.comboBox1 = QCheckBox()
self.comboBox2 = QCheckBox()
self.comboBox3 = QCheckBox()
...
# Словарь пар QCheckBox -> QComboBox
self.widgetPairs = {}
self.widgetPairs[self.checkBox1] = self.comboBox1
self.widgetPairs[self.checkBox2] = self.comboBox2
self.widgetPairs[self.checkBox3] = self.comboBox3
# Соединение сигнала stateChanged со слотом-обработчиком события
self.checkBox1.stateChanged.connect(self.changeComboBoxState)
self.checkBox2.stateChanged.connect(self.changeComboBoxState)
self.checkBox3.stateChanged.connect(self.changeComboBoxState)
# Или через цикл
for cb in self.widgetPairs:
cb.stateChanged.connect(self.changeComboBoxState)
# Или через цикл и без слота-обработчика, но с лямбдой (почитайте где-нибудь что это такое)
for cb in self.widgetPairs:
# Здесь state - состояние чекбокса
# cb=cb - захват текущего checkBox
cb.stateChanged.connect(lambda state, cb=cb: self.widgetPairs[cb].setEnabled(state == Qt.Checked))
# Функция-слот
def changeComboBoxState(self, state):
# Здесь функция self.sender() возвращает виджет, который инициировал событие
comboBox = self.widgetPairs[self.sender()]
comboBox.setEnabled(state == Qt.Checked)
# или в одну строчку
# self.widgetPairs[self.sender()].setEnabled(state == Qt.Checked)