0
votes

Basculer un QRadiobutton dans PYQT5: Décochez la case lorsqu'un bouton radio vérifié est cliqué

J'utilise des QRadiobuttons à l'intérieur d'un QButTontongroup à PyqT5. J'aimerais que l'utilisateur puisse sélectionner l'une des options exclusives ou aucune des options exclusives, donc s'il clique accidentellement sur un bouton radio, il devrait être capable de cliquer à nouveau pour le décocher.

Mon approche actuelle consiste à connecter la méthode cliquée à une fonction personnalisée qui vérifie le statut du bouton, mais je ne pouvais pas comprendre comment le faire de manière simple, sans utiliser des compteurs de clic ombragés. P>

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_()


2 commentaires

Désolé, pourquoi n'utilisez-vous pas QCheckBox?


@ S.Nick L'utilisateur doit pouvoir sélectionner une seule option (ou aucune). Je ne sais pas si cela peut être atteint avec QCheckBox (je suppose que oui), mais même si c'est le cas, je pense que les utilisateurs ont tendance à associer l'exclusivité de check-exclusif avec des boutons radio rondes que les cases à cocher au carré. Ce n'est qu'une opinion, bien sûr, et je suis ouvert à la discussion.


3 Réponses :


1
votes

Essayez-le: xxx

 Entrez la description de l'image ici


1 commentaires

Désolé, je pense que nous pouvons vivre dans différentes fuseaux horaires et hier, je devais aller dormir. J'essayais juste votre code, mais malgré cela fonctionne, il y a un problème avec cela: je ne peux pas utiliser de texte dans les Radiobuttons et j'aurai beaucoup de radios, alors garder ce dict me semble un peu trop pour moi. Mais merci pour votre solution quand même. Mais j'ai trouvé une autre solution que je viens de poster.



0
votes

Enfin, je suis venu avec une solution en deux étapes: d'abord, le groupe de boutons n'est pas exclusif, de sorte que les boutons peuvent être décochés lorsqu'ils cliquèrent à nouveau. Et deuxièmement, lorsqu'une radio est sélectionnée, décochez chaque autre bouton.

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_()


1 commentaires

Je pense qu'il y a une approche légèrement meilleure. Vous pouvez également transmettre le groupe dans check_buttonons (auto, radiobutton, radiogroupe) de sorte que cette fonction devienne réutilisable pour le prochain QButTontongroup, en totalisant sans dépend de la variable de classe



-2
votes

def Delectradiobuttons (auto):

    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)


0 commentaires