Активация 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)
→ Ссылка