Как запустить цикл, используя имена объектов GUI в QT? - PullRequest
2 голосов
/ 14 июля 2011

У меня есть форма графического интерфейса, где присутствуют несколько текстовых полей.Я хочу поместить их значения в массив.Один из способов сделать это - написать что-то вроде этого

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

и повторить это для text_2, text_3 до n.

Что мне нужно, это запустить цикл и заменить числовую часть текстаимя блока в каждом цикле.

как-то так {array element } = ui->text_{This number getting changed }->text();

Как это можно сделать в qt?

Ответы [ 4 ]

7 голосов
/ 14 июля 2011

Это можно сделать двумя способами.

  1. При создании пользовательского интерфейса вместо использования text1, text2 и т. Д. Создается массив QLineEdits (например, std::vector<QLineEdit>), а затем, когда вы хотите получить их значения, просто выполните итерацию по этому массиву

  2. Выполните итерации по дочерним элементам контейнерного виджета.Вы можете получить список детей, используя следующее ( документация ):


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

4 голосов
/ 22 июля 2011

Другим вариантом для перечисленных будет создание массива с использованием списка инициализаторов. В зависимости от того, насколько большой массив (и как часто он изменяется), это может быть работоспособным.

QLineEdit* entries[] = { ui->text_0, ui->text_1, ui=>text_2 };
QStringList answers;
for ( int i = 0; i < 3; ++i )
{
    answers += entries[i]->text();
}
1 голос
/ 25 июня 2012

вот расширенная версия решения Матяса:

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);
       }
   }
};
0 голосов
/ 25 июня 2012

Если это просто изменение числа и постоянное увеличение, есть другое возможное решение, использующее 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...