【问题标题】:uncheck radiobutton - PyQt4取消选中单选按钮 - PyQt4
【发布时间】:2012-01-31 04:09:04
【问题描述】:

在此代码示例中:

from PyQt4.QtGui import QDialog, QPushButton, QRadioButton, QHBoxLayout, QApplication, QButtonGroup
import sys

class Form(QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent=None)

        button = QPushButton('Button')
        self.radiobutton1 = QRadioButton('1')
        self.radiobutton2 = QRadioButton('2')
        #self.group = QButtonGroup()
        #self.group.addButton(self.radiobutton1)
        #self.group.addButton(self.radiobutton2)       
        #self.group.setExclusive(False)

        layout = QHBoxLayout()
        layout.addWidget(button)
        layout.addWidget(self.radiobutton1)
        layout.addWidget(self.radiobutton2)
        self.setLayout(layout)

        button.clicked.connect(self.my_method)

    def my_method(self):
        self.radiobutton1.setChecked(False)
        self.radiobutton2.setChecked(False)

app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

单击按钮时,我希望选中的单选按钮未被选中,但这永远不会发生。如果我取消注释注释行并运行代码,那么我可以取消选中单选按钮。但另一个问题出现了。因为该组不是独占的,所以我可以设置两个radioButtons 检查一些不能发生的事情。

我应该怎么做才能在一次只能选择一个按钮的情况下取消选中按钮?

【问题讨论】:

    标签: python radio-button pyqt4


    【解决方案1】:

    对于寻求简单解决这个非常烦人的问题的任何人,请将每个按钮连接到控制其他按钮的 CheckState 的 slot。

    只需将您想要的按钮列表添加到QButtonGroup,获取按钮列表,检查sender 是否不是同一个按钮,然后取消选中其他按钮。

    假设你在一个循环中实例化你的按钮,你可以很容易地实现这个:

    self.bg = QButtonGroup()
    self.bg.setExclusive(False)
    
    for button in list_of_buttons:
        self.bg.addButton(button)
        button.clicked.connect(self.uncheck_other_buttons)
    
    
    def uncheck_other_btns(self):
        for button in self.bg.buttons():  # returns the list of all added buttons
            if self.sender() != button:   # in PyQt5, button.objectName() fails if name isn't set, 
                                          # instead, simply check that the signal sender() object  
                                          # is not the same object as the clicked button
                button.setChecked(False)  # then set all other buttons to be unchecked
    

    【讨论】:

      【解决方案2】:

      这感觉像是作弊,但确实有效:

      import sys
      import PyQt4.QtGui as QtGui
      
      class Form(QtGui.QDialog):
          def __init__(self, parent=None):
              super(Form, self).__init__(parent)
      
              button = QtGui.QPushButton('Button')
              button.clicked.connect(self.my_method)
      
              self.radiobutton1 = QtGui.QRadioButton('1')
              self.radiobutton2 = QtGui.QRadioButton('2')
      
              layout = QtGui.QHBoxLayout()
              layout.addWidget(button)
              layout.addWidget(self.radiobutton1)
              layout.addWidget(self.radiobutton2)
              self.setLayout(layout)
      
              self.group = QtGui.QButtonGroup()
              self.group.addButton(self.radiobutton1)
              self.group.addButton(self.radiobutton2)       
      
          def my_method(self):
              self.group.setExclusive(False)        
              self.radiobutton1.setChecked(False)
              self.radiobutton2.setChecked(False)
              self.group.setExclusive(True)
      
      app = QtGui.QApplication(sys.argv)
      form = Form()
      form.show()
      app.exec_()
      

      正如您所指出的,当设置了self.group.setExclusive(False) 时,您可以取消切换两个单选按钮。

      而self.group.setExclusive(True)时,只能设置一个单选按钮。

      所以my_method 只需调用self.group.setExclusive(False),这样它就可以取消设置两个单选按钮,然后重置self.group.setExclusive(True)。


      PS。我认为parent不应该在这一行设置为None:

      super(Form, self).__init__(parent = None)
      

      因为如果将一个重要的parent 发送到Form,您可能希望将parent 传递给QDialog.__init__。

      【讨论】:

      • QButtonGroup 在 PyQt5 中的 QtWidgets(不是 QtGui)中
      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 2012-01-23
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2023-03-29
      相关资源
      最近更新 更多