0

QButtonGroupコンテナ内に2つのラジオボタンを持つGUIがあります.QGroupBox内にあります(このボタングループには右クリックのコンテキストメニューが必要です.QButtonGroupには視覚的な表現がないため、setContextMenuPolicyがないようです)メソッド) 次のコード スニペットは、シリアル リンクからの受信データに応答して、相互に排他的なボタンの状態を更新することになっています。

elif widgetName in self.buttonBoxDict:
            buttonGroup = getattr(self.ui, self.buttonBoxDict[widgetName])
            checkedButton = buttonGroup.checkedButton()
            checkedButtonName = str(checkedButton.objectName())
            if value >= self.onValue and self.buttonDict[checkedButtonName][1] == self.offValue:
                checkedButton.toggle()
                assert(not checkedButton.isChecked())
                self.windowHandler.buttonChanged(self, self.onValue, cc)
            elif value < self.onValue and self.buttonDict[checkedButtonName][1] == self.onValue:
                checkedButton.toggle()
                self.windowHandler.buttonChanged(self, self.offValue, cc)

残念ながら、これは機能していません。最初にここで選択したボタンがチェックされていることはわかっていますが、GUI のボタンの状態は変化せず、コードが適切に実行されているように見えても、アサーションは常に失敗します。なぜこれがうまくいかないのかについてのアイデアはありますか?

4

2 に答える 2

1

あなたが抱えている問題は、排他的に設定された QButtonGroup を使用しているという事実に基づいています。ドキュメントを見ると、次のように記載されていることがわかります。

ユーザーは、現在チェックされているボタンをクリックしてチェックを外すことはできません。代わりに、グループ内の別のボタンをクリックする必要があります

アプリケーションのロジックはわかりませんが、排他的なボタン グループを使用している場合は、差分ボタンをチェックするように設定するか、排他的なグループを使用せずに自分でチェックを強制する必要があります。

以下は、表示されている内容の小さな例です。

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)
button1 = QtGui.QCheckBox('test 1')
group = QtGui.QButtonGroup()
group.setExclusive(True)
group.addButton(button1)
print button1.isChecked()
button1.toggle()
print button1.isChecked()
button1.toggle()
print button1.isChecked()
# toggle seems not to work, add a second button
button2 =  QtGui.QCheckBox('test 2')
group.addButton(button2)
print button2.isChecked()
button2.toggle()
print button1.isChecked()
print button2.isChecked()
于 2012-06-04T09:50:43.277 に答える
0

mandel によるヘッズアップのおかげで、2 ボタンの排他的なグループに対して「期待」したとおりに動作させるための簡単な修正は、コードを次のように変更することです。

if value >= self.onValue and self.buttonDict[checkedButtonName][1] == self.offValue:
     for button in buttonGroup.buttons():
          if button != checkedButton:
               button.toggle()
于 2012-06-04T22:30:06.487 に答える