2017-08-12 54 views
-1

我取得了Qt設計GUI和我有144個複選框。我想用QPushButton連接它們,檢查並取消選中它們。檢查所有QCheckBox在QtGui.QGridLayout

我該怎麼做? 他們都是內部QGridLayout的。

它們被命名爲遵循「潮流」,所以我試着寫自己的名字在列表中並調用列表中的每一項檢查,但我沒有管理。

這個例子或多或少像我有什麼

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

我想打一個按鈕,檢查,並取消所有的人,而不必鍵入鰲connect小號

+0

呀,那呀! 但是當我做它直接Qt的設計師,它會爲每個連接如一條線,因爲我有很多他們的代碼會很長 我想有我試圖在這裏一個更好的辦法 –

+0

,不過雖然按鈕在那裏,通過點擊改變其狀態,箱子不對此作出迴應 –

+0

太感謝你了!它的工作,我在這裏做一些愚蠢的事情:P –

回答

1

這是乏味的必須作出許多連接,但正如你所說,你可以用findChildren創建一個對象名單,但首先添加一個按鈕的設計。

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) 
     ... 

然後我們實現另一個類的邏輯,我們使用findChildren獲得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_())