访问多个小部件

时间:2013-12-15 17:33:36

标签: python qt widget qlineedit

我使用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")

问题在于,据我所知,在拖放小部件时,Qt Designer会自动在名称末尾添加一个数字... lineEdit1,lineEdit2,....所以之后我不知道如何在代码中访问所有这些内容。

3 个答案:

答案 0 :(得分: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 Designer将所有小部件放在容器小部件(例如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向其添加小部件。

答案 1 :(得分:0)

如果您真的想使用QT设计器,我想您最好的解决方案是简单地将小部件添加到列表中。 我知道这是次优的,但这样你只需要做一次。

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

另一种解决方案是简单地迭代孩子。这是here的解释,没有理由重复。

答案 2 :(得分: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) );
}
相关问题