0

我在 QButtonGroup 容器内有一个带有两个单选按钮的 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 的提醒,一个快速的解决方法是让事情按照我“预期”的方式运行,以便为一个双按钮独占组将代码更改为如下所示:

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 回答