【问题标题】:Accessing multiple widgets访问多个小部件
【发布时间】:2013-12-15 17:33:35
【问题描述】:

我已经使用 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,....所以之后我不知道如何在代码中访问所有这些。

【问题讨论】:

    标签: python qt widget qlineedit


    【解决方案1】:

    首先,您不必接受在 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 Designer 中可用:只需将Form Layout 拖放到主窗体上,然后使用右键菜单中的Add form layout row 向其中添加小部件。

    【讨论】:

    • 谢谢!!我不知道那些东西 findChildren 等,听起来这就是我要找的东西。再次感谢您的回答,我会尝试的。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      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) );
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多