2017-08-13 102 views
-1

我創建了一個包含許多複選框的應用程序。每4個複選框位於groupBox_n(n = 36)內,然後這些組框位於另一個組框中。從複製對象名稱的列表中調用對象

每個複選框都按照一定的規則命名,這對我來說非常方便。我想訪問他們每個人,但我不想每次輸入他們的名字。所以我儘管關於在列表中重現他們的名字,以便我可以遍歷列表並控制,取決於他們的名字。

但是,當我嘗試連接一個按鈕,從我的列表中調用一個字符串,我無法做到這一點。這裏我用QLineEdit重現了一個例子。

是否有可能做這樣的事情?

調用findChildren不能幫助我,因爲那時我不知道我的checkBox在我的應用程序中的位置或「誰是誰」在那裏。通過ObjectName調用也是不可能的,是嗎?

from PyQt4 import QtCore, QtGui 

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

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.My_lineEdit = QtGui.QLineEdit(Form) 
     self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit")) 

     self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) 
     self.pushButton = QtGui.QPushButton(Form) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1) 

     MyStrinng = 'My_lineEdit' 
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.Mystring.clear) 

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

這樣,PyQt不承認我的字符串作爲對象的名稱。我也試圖使PyQt字符串QCore.QString('My_lineEdit'),但QString不適用於我的版本(you can see here)

這個我可以重現我所有的複選框的名稱。

names = [] 

for x in range(0, 6): 
    for y in range(0, 6): 
     for z in range(1, 5): 
      Names = 's'+str(x)+str(y)+'0'+str(z) 
      names.append(Names) 
print(names) 
+1

你想讓你的objectName的每個複選框? – eyllanesc

+0

當我得到一個列表時,哪個框是重要的。 我不知道我可以在搜索中指定名稱。謝謝! 你認爲我能以某種方式將它與我創建的名稱列表進行比較嗎?類似於Mylist中的名稱:myList = parentWidget.findChild(QPushButton,「name」)' –

+0

是的,如果可以的話,但更好地解釋自己。根據你的問題你有一個名稱模式,你可以爲你想要的東西放置一個有效的例子。 – eyllanesc

回答

2

如果你想找到它的對象的對象,最簡單的選擇是使用findChild()

牛逼的QObject :: findChild(常量QString的&名= QString的(), 的Qt :: FindChildOptions選項= Qt的:: FindChildrenRecursively)const的

返回此對象可以被鑄造成T類型的兒童和 被稱爲名稱,或0,如果療法e不是這樣的對象。省略名稱 參數會導致所有對象名稱匹配。搜索是 遞歸執行,除非選項指定選項 FindDirectChildrenOnly。

如果有多個子項匹配搜索,則返回最直接的 祖先。如果有幾個直接的祖先,它是 未定義哪一個將被返回。在這種情況下,應該使用findChildren() 。

此示例返回一個孩子parentWidget的QPushButton命名 「Button1的」,即使按鈕不是父母的直接子:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1"); 

在C++的例子是在文檔中將被轉換爲以下形式的蟒蛇:

button = parentWidget.findChild(QPushButton, "button1") 

你的情況:

class Ui_Form(object): 
    def setupUi(self, Form): 
     ... 
     # change self.lineEdit to self.My_lineEdit 
     #Form is the parent of My_lineEdit      
     self.My_lineEdit = QtGui.QLineEdit(Form) 
     self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit")) 

     self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) 

     ... 

     le = Form.findChild(QtGui.QLineEdit, "My_lineEdit") 
     self.pushButton.clicked.connect(le.clear) 
相關問題