[ ]All1 [ ]All2
[ ]checkbox1A [ ]checkbox1B
[ ]checkbox2A [ ]checkbox2B
上記のチャートに基づいて、いくつかのことを行う必要があります。
- すべてのチェックボックスは、それが存在する列のオン/オフにのみ影響し、その列のすべてのチェックボックスをオン/オフにします。
- すべてのチェックボックスはペアで機能するため、checkbox1A がオン/オフの場合、checkbox1B はオン/オフする必要があります
- [すべて] チェックボックスがオンになっていて、ユーザーが列の 1 つ以上のチェックボックスをオフにした場合、[すべて] チェックボックスはオフにする必要がありますが、既にオンになっているすべてのチェックボックスはオンのままにする必要があります。
つまり、これは連鎖反応のセットアップに似ています。チェックボックス All1 がオンの場合、chieckbox1A と 2A がオンになり、オンになっているため、checkbox1B と 2B もオンになりますが、チェックボックス All2 はオフのままです。このロジックに基づいて信号を接続してみましたが、対になったロジックだけが 100% 機能します。すべてのチェックボックスのロジックは 50% の確率でしか機能せず、正確ではありません。既にチェックされているすべてのチェックボックスをオフにしない限り、すべてのチェックボックスをオフにする方法はありません。
本当に本当に助けが必要です... 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 の助けと忍耐のおかげで、私はコードをよりクリーンなものに削減し、1 番目と 2 番目の望ましい動作で 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)
ユーザーがモジュラーチェックボックスを選択的にオフにした場合にのみ、すべてのチェックボックスをオフにする必要があります