如何在qt中使用gui对象名运行循环?

时间:2011-07-14 10:38:16

标签: c++ qt

我有一个gui表单,其中存在多个文本框。我想将它们的值放在数组中。一种方法是写这样的东西

{array element } = ui->text_1->text();

并将其重复为text_2,text_3至n。

我想要的是运行循环并在每个循环中替换文本框名称的数字部分。

像这样{array element } = ui->text_{This number getting changed }->text();

如何在qt中完成?

4 个答案:

答案 0 :(得分:7)

有两种方法可以做到这一点。

  1. 创建用户界面时,不是使用text1text2等,而是创建一个QLineEdit的数组(例如。std::vector<QLineEdit>)和然后当你想要检索它们的值时,只需遍历这个数组

  2. 迭代容器小部件的子代。您可以使用以下内容获取子项列表(documentation):

  3. 
       QList<QObject *> list = parentWidget->children();
    
    

答案 1 :(得分:4)

列出的那些选项的另一个选项是使用初始化列表创建数组。根据数组的大小(以及更改的频率),这可能是可行的。

QLineEdit* entries[] = { ui->text_0, ui->text_1, ui=>text_2 };
QStringList answers;
for ( int i = 0; i < 3; ++i )
{
    answers += entries[i]->text();
}

答案 2 :(得分:1)

这是Matyas解决方案的扩展版本:

class MyClass : public QWidget
{
   QStringList answers;
   void FillAnswersList(QObject *base)
   {
       QLineEdit *lineEdit = qobject_cast<QLineEdit>(base);
       if(lineEdit)answers.append(lineEdit->text());       
       else 
       {
           foreach(QObject *child, base->children())
              FillAnswersList(child);
       }
   }
};

答案 3 :(得分:0)

如果仅仅是数字变化,并且总是递增,那么使用QObject::findChild还有另一种可能的解决方案,它将名称作为参数。

QString name_template("text_%1");
QStringList answers;
for(int i = 0; i < MAX_TEXTS; ++i)
{
    QLineEdit *edit = ui->findChild<QLineEdit *>(name_template.arg(i));
    answers += edit->text();
}