2017-08-12 18 views
-1

J'ai créé une interface graphique dans Qt Designer et j'ai 144 cases à cocher. Je veux connecter tous avec un QPushButton pour les cocher et les décocher tous.Cocher tout QCheckBox dans un QtGui.QGridLayout

Comment puis-je faire cela? Ils sont tous à l'intérieur d'un QGridLayout. Ils sont nommés suite à une "tendance", j'ai donc essayé d'écrire leurs noms dans une liste et d'appeler chaque élément de la liste pour vérifier, mais je n'ai pas réussi.

Cet exemple est plus ou moins comme ce que j'ai

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'check.ui' 
# 
# Created by: PyQt4 UI code generator 4.11.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(400, 300) 
     self.gridLayout = QtGui.QGridLayout(Form) 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     self.checkBox_2 = QtGui.QCheckBox(Form) 
     self.checkBox_2.setObjectName(_fromUtf8("checkBox_2")) 
     self.gridLayout.addWidget(self.checkBox_2, 2, 0, 1, 2) 
     self.checkBox = QtGui.QCheckBox(Form) 
     self.checkBox.setObjectName(_fromUtf8("checkBox")) 
     self.gridLayout.addWidget(self.checkBox, 2, 2, 1, 1) 
     self.checkBox_3 = QtGui.QCheckBox(Form) 
     self.checkBox_3.setObjectName(_fromUtf8("checkBox_3")) 
     self.gridLayout.addWidget(self.checkBox_3, 3, 0, 1, 2) 
     self.checkBox_4 = QtGui.QCheckBox(Form) 
     self.checkBox_4.setObjectName(_fromUtf8("checkBox_4")) 
     self.gridLayout.addWidget(self.checkBox_4, 3, 2, 1, 1) 
     self.checkBox_5 = QtGui.QCheckBox(Form) 
     self.checkBox_5.setObjectName(_fromUtf8("checkBox_5")) 
     self.gridLayout.addWidget(self.checkBox_5, 1, 2, 1, 1) 
     self.checkBox_6 = QtGui.QCheckBox(Form) 
     self.checkBox_6.setObjectName(_fromUtf8("checkBox_6")) 
     self.gridLayout.addWidget(self.checkBox_6, 1, 0, 1, 1) 


     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(_translate("Form", "Form", None)) 
     self.checkBox_2.setText(_translate("Form", "CheckBox", None)) 
     self.checkBox.setText(_translate("Form", "CheckBox", None)) 
     self.checkBox_3.setText(_translate("Form", "CheckBox", None)) 
     self.checkBox_4.setText(_translate("Form", "CheckBox", None)) 
     self.checkBox_5.setText(_translate("Form", "CheckBox", None)) 
     self.checkBox_6.setText(_translate("Form", "CheckBox", None)) 




if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

Je veux faire un bouton pour cocher et décocher toutes sans avoir à taper ao la connect s

+0

Ouais, que! mais quand je le fais directement sur Qt designer, il crée une ligne pour chaque conection, et comme j'en ai beaucoup, le code devient très long Je suppose qu'il y a un meilleur moyen –

+0

J'essayais ici, mais bien que le bouton est là et change d'état en cliquant, la boite n'y répond pas –

+0

Merci beaucoup !! Ca a marché, je faisais quelque chose de stupide ici: P –

Répondre

1

Il est fastidieux de avoir à faire beaucoup de connexions, mais comme vous le dites, vous pouvez créer une liste d'objets avec findChildren, mais d'abord ajouter un bouton à la conception.

class Ui_Form(object): 
    def setupUi(self, Form): 
     ... 
     self.gridLayout.addWidget(self.checkBox_6, 1, 0, 1, 1) 


     self.btn = QtGui.QPushButton("Check", Form) 
     self.gridLayout.addWidget(self.btn, 4, 0, 1, 3) 


     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 
     ... 

Ensuite, nous mettons en œuvre la logique dans une autre classe et nous utilisons findChildren pour obtenir le QCheckBox:

class Widget(QtGui.QWidget, Ui_Form): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 
     self.checkBoxList = self.findChildren(QtGui.QCheckBox) 
     self.btn.clicked.connect(self.onClicked) 

    def onClicked(self): 
     state = self.sender().text() == "Check" 
     for btn in self.checkBoxList: 
      btn.setChecked(state) 

     self.sender().setText("Uncheck" if state else "Check") 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = Widget() 
    Form.show() 
    sys.exit(app.exec_())