我在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中按钮的状态永远不会改变,即使代码似乎正在执行,断言也总是失败。关于为什么会出错的任何想法?
答案 0 :(得分:1)
您遇到的问题是基于您使用的QButtonGroup设置为独占的事实。如果您查看documentation,您会看到它说明了以下内容:
用户无法通过单击取消选中当前选中的按钮;相反,必须单击组中的另一个按钮
我不知道您的应用程序的逻辑,但如果您使用的是独占按钮组,则需要设置要检查的差异按钮,或者不要使用专用组并自行执行检查。
以下是您所看到的一个小例子:
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()
答案 1 :(得分:0)
快速修复,感谢mandel的单挑,让我的行为符合我对“双按钮”专属组的“期望”,就是将代码更改为:
if value >= self.onValue and self.buttonDict[checkedButtonName][1] == self.offValue:
for button in buttonGroup.buttons():
if button != checkedButton:
button.toggle()