【问题标题】:PyQT - button.toggle() method not workingPyQT - button.toggle() 方法不起作用
【发布时间】:2012-06-05 06:30:06
【问题描述】:

我在 QButtonGroup 容器内有一个带有两个单选按钮的 GUI,该容器本身位于 QGroupBox 内(此按钮组需要右键单击上下文菜单,并且由于 QButtonGroup 没有视觉表示,因此它似乎没有有一个 setContextMenuPolicy 方法。)下面的代码 sn-p 应该更新互斥按钮的状态以响应来自串行链接的传入数据:

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

【问题讨论】:

  • 没有上下文就很难理解。你能提供一个可运行的例子来解决这个问题吗?
  • @Avaris 感谢您的回复 - 我会看看是否可以将一些更简单的东西放在一起来说明问题。

标签: python pyqt


【解决方案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()

【讨论】:

    【解决方案2】:

    多亏了 mandel 的提醒,一个快速的解决方法是让事情按照我“预期”的方式运行,以实现双按钮独占组,将代码更改为如下所示:

    if value >= self.onValue and self.buttonDict[checkedButtonName][1] == self.offValue:
         for button in buttonGroup.buttons():
              if button != checkedButton:
                   button.toggle()
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2018-02-26
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多