PyQT - button.toggle()方法不起作用

时间:2012-06-03 21:02:27

标签: python pyqt

我在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中按钮的状态永远不会改变,即使代码似乎正在执行,断言也总是失败。关于为什么会出错的任何想法?

2 个答案:

答案 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()