2013-12-15 100 views
1

我已經使用Qt Designer創建了一個GUI,我有20個或更多的lineEdit小部件,我正在尋找正確的方式來訪問它們,而不必訪問每個小部件...我用一個示例在僞代碼:訪問多個小部件

這是我不想要的東西:

lineEdit1.setText("Value = 1") 
lineEdit2.setText("Value = 2") 
lineEdit3.setText("Value = 3") 
and so on, up to 
lineEdit20.setText("Value = 20") 

我期待這樣的事情:

for i in xrange(1,21): 

    lineEdit(i).setText("Value = whatever") 

的問題是,據我所知,當拖放g widgets,Qt Designer會自動在名稱的末尾添加一個數字... lineEdit1,lineEdit2,....所以之後我不知道如何在代碼中訪問它們。

回答

0

如果你真的想使用QT設計器,我想你最好的解決方案是簡單地將小部件添加到列表中。 我知道這是次優的,但這種方式你只需要做一次。

lineEditL = [] 
lineEditL.append(lineEdit1) 
lineEditL.append(lineEdit2) 

另一種解決方案是簡單地迭代孩子。這是解釋here,沒有理由重複。

2

首先,您不必接受在Qt Designer中自動分配的名稱。只需將objectName屬性設置爲最適合的值即可。

要遍歷多組窗口小部件,有幾個可用的QObject方法。

最厲害的是findChildren,可以根據他們的階級遞歸搜索對象/部件:

for child in self.findChildren(QtGui.QLineEdit): 
    child.setValue(value) 

以及他們的objectName:

rgx = QtCore.QRegExp('lineEdit[0-9]+') 
for child in self.findChildren(QtGui.QLineEdit, rgx): 
    child.setValue(value) 

但一個簡單的技術將使用Qt設計器將所有小部件放入容器小部件(例如QWidget,QFrame,QGroupBox等)中,然後使用非遞歸的children方法循環它們:

for index, child in enumerate(self.groupBox.children()): 
    child.setValue(value[index]) 

您可能還想考慮使用QFormLayout,它提供了一種更有條理的做事方式。這在Qt Designer中可用:只需將Form Layout拖放到主窗體上,然後使用右鍵菜單中的Add form layout row向其添加小部件。

+0

Thanks !!我不知道findChildren等那些東西,聽起來像是我正在尋找的東西。再次感謝您的回答,我會盡力而爲。 – codeKiller

0
QWidget *pWin = QApplication::activeWindow(); 
for(int i=1; i<=21; i++) { 
    QString strName ="LineEdit"+QString::number(i); 
    QLineEdit *le = pWin->findChild<QLineEdit *>(strName); 
    if(le) le->setText("Value = "+Qstring::number(i)); 
} 
+4

請給你的代碼添加解釋。 – Mark