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_()
3 Réponses :
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.
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_()
Je pense qu'il y a une approche légèrement meilleure. Vous pouvez également transmettre le groupe dans check_buttonons (auto, radiobutton, radiogroupe) code> de sorte que cette fonction devienne réutilisable pour le prochain QButTontongroup, en totalisant sans dépend de la variable de classe
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)
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.