访问多个小部件

2024-10-02 02:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Qt设计器制作了一个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,…因此在此之后,我不知道如何访问代码中的所有小部件。你知道吗


Tags: and方法代码sovalueon部件gui
3条回答

首先,您不必接受Qt Designer中自动指定的名称。只需将objectName属性设置为最合适的。你知道吗

为了迭代多组小部件,有几种QObject方法可用。你知道吗

最强大的是findChildren,它可以基于类递归地搜索对象/小部件:

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

还有他们的名字:

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设计器中可用:只需将Form Layout拖放到主窗体上,然后使用右键单击菜单中的Add form layout row向其添加小部件。你知道吗

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

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

另一种解决方案是简单地迭代子对象。这是解释here,没有理由重复。你知道吗

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) );
}

相关问题 更多 >

    热门问题