[ ]All1 [ ]All2
[ ]checkbox1A [ ]checkbox1B
[ ]checkbox2A [ ]checkbox2B
根据上面的图表,需要做一些事情:
- All 复选框仅影响其所在列的开/关,并检查该列中所有复选框的开/关。
- 所有复选框成对工作,所以如果 checkbox1A 是开/关,checkbox1B 需要开/关
- 如果选中了 All 复选框,然后用户继续选中列中的一个或多个复选框,则 All 复选框应取消选中,但所有已选中的复选框应保持选中状态。
所以实际上这更像是连锁反应设置。如果复选框 All1 处于打开状态,则 chieckbox1A 和 2A 将处于打开状态,并且因为它们处于打开状态,所以 checkbox1B 和 2B 也处于打开状态,但复选框 All2 保持关闭状态。我尝试根据此逻辑连接信号,但只有配对逻辑 100% 有效。All 复选框逻辑仅在 50% 的情况下有效,而且不准确,如果不关闭所有已选中的复选框,我无法关闭 All 复选框。
真的真的很需要帮助...TT
示例代码:
cbPairKeys = cbPairs.keys()
for key in cbPairKeys:
cbOne = cbPairs[key][0][0]
cbTwo = cbPairs[key][1][0]
cbOne.stateChanged.connect(self.syncCB)
cbTwo.stateChanged.connect(self.syncCB)
def syncCB(self):
pairKeys = cbPairs.keys()
for keys in pairKeys:
cbOne = cbPairs[keys][0][0]
cbOneAllCB = cbPairs[keys][0][4]
cbTwo = cbPairs[keys][1][0]
cbTwoAllCB = cbPairs[keys][1][4]
if self.sender() == cbOne:
if cbOne.isChecked() or cbTwoAllCB.isChecked():
cbTwo.setChecked(True)
else:
cbTwo.setChecked(False)
else:
if cbTwo.isChecked() or cbOneAllCB.isChecked():
cbOne.setChecked(True)
else:
cbOne.setChecked(False)
编辑
感谢用户 Avaris 的帮助和耐心,我能够将代码简化为更简洁的代码,并且 100% 的时间在第一个和第二个期望的行为上工作:
#Connect checkbox pairs
cbPairKeys = cbPairs.keys()
for key in cbPairKeys:
cbOne = cbPairs[key][0][0]
cbTwo = cbPairs[key][1][0]
cbOne.toggled.connect(cbTwo.setChecked)
cbTwo.toggled.connect(cbOne.setChecked)
#Connect allCB and allRO signals
cbsKeys = allCBList.keys()
for keys in cbsKeys:
for checkbox in allCBList[keys]:
keys.toggled.connect(checkbox.setChecked)
当用户现在有选择地关闭模块化复选框时,只需要关闭 All 复选框的帮助