2

我在 pyQt5 的 QButtonGroup 中使用了一些 QRadioButtons。我希望用户能够选择一个独占选项或不选择,所以如果他不小心单击了一个单选按钮,他应该能够再次单击它以取消选中它。

我目前的方法是将 clicked 方法连接到检查按钮状态的自定义函数,但我不知道如何以简单的方式执行此操作,而不使用阴暗的点击计数器。

from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QHBoxLayout, QButtonGroup
import sys


class MainWindow(QWidget):

    def __init__(self):

        super().__init__()

        # Radio buttons
        self.group = QButtonGroup()

        self.b1 = QRadioButton()
        self.group.addButton(self.b1)
        self.b1.clicked.connect(lambda: self.radioButtonClicked())

        self.b2 = QRadioButton()
        self.group.addButton(self.b2)
        self.b2.clicked.connect(lambda: self.radioButtonClicked())

        # Layout
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.b1)
        self.layout.addWidget(self.b2)
        self.setLayout(self.layout)


    def radioButtonClicked(self):
        if self.sender().isChecked():
            self.sender().setAutoExclusive(False)
            self.sender().setChecked(False) # This is not working, as it fires on the first click
            self.sender().setAutoExclusive(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
4

3 回答 3

3

最后,我提出了一个分两步的解决方案:首先,使按钮组不排他性,以便再次单击时可以取消选中按钮。And second, when a radio is selected, uncheck every other button.

from PyQt5.QtWidgets import (QApplication, QWidget, QRadioButton,QHBoxLayout, QButtonGroup)
import sys

class MainWindow(QWidget):

    def __init__(self):

        super().__init__()

        # Radio buttons
        self.group = QButtonGroup()
        self.group.setExclusive(False)  # Radio buttons are not exclusive
        self.group.buttonClicked.connect(self.check_buttons)

        self.b1 = QRadioButton()
        self.group.addButton(self.b1)

        self.b2 = QRadioButton()
        self.group.addButton(self.b2)

        # Layout
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.b1)
        self.layout.addWidget(self.b2)
        self.setLayout(self.layout)


    def check_buttons(self, radioButton):
        # Uncheck every other button in this group
        for button in self.group.buttons():
            if button is not radioButton:
                button.setChecked(False)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
于 2020-06-16T17:55:45.337 回答
2

试试看:

from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QHBoxLayout, QButtonGroup
import sys


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self._dictRB = {                                                   # +++                                         
            'rb1': False,
            'rb2': False,
            'rb3': False,
        }


        # Radio buttons
        self.group = QButtonGroup()

        self.b1 = QRadioButton('rb1')                                       # + 'rb1'  
        self.group.addButton(self.b1)
#        self.b1.clicked.connect(lambda: self.radioButtonClicked())

        self.b2 = QRadioButton('rb2')                                       # + 'rb2'  
        self.group.addButton(self.b2)
#        self.b2.clicked.connect(lambda: self.radioButtonClicked())

        self.b3 = QRadioButton('rb3')                                       # +++
        self.group.addButton(self.b3)

        # Layout
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.b1)
        self.layout.addWidget(self.b2)
        self.setLayout(self.layout)

        self.group.buttonClicked.connect(self.check_button)                 # +++

    def check_button(self, radioButton):                                    # +++
        if self._dictRB[radioButton.text()]:
            self._dictRB[radioButton.text()] = False
            self._dictRB['rb3'] = True
            self.b3.setChecked(True)           
        else:
            for b in self._dictRB:
                self._dictRB[b] = False
            self._dictRB[radioButton.text()] = True
        print("clickеd button -> `{} - {}`".format(radioButton.text(), radioButton.isChecked()))        

    '''
    def radioButtonClicked(self):
        if self.sender().isChecked():
            self.sender().setAutoExclusive(False)
            self.sender().setChecked(False)         # This is not working, as it fires on the first click
            self.sender().setAutoExclusive(True)
    '''


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

在此处输入图像描述

于 2020-06-15T21:22:05.210 回答
-2

def delectRadioButtons(self):

    if self.radioButton_female.isCheckable() or self.radioButton_male.isCheckable():
        self.radioButton_male.setChecked(True)
        self.radioButton_female.setChecked(True)
        self.radioButton_male.setCheckable(False)
        self.radioButton_female.setCheckable(False)



    self.radioButton_female.setCheckable(True)
    self.radioButton_male.setCheckable(True)
于 2020-10-28T01:57:24.403 回答