我有一个gui表单,其中存在多个文本框。我想将它们的值放在数组中。一种方法是写这样的东西
{array element } = ui->text_1->text();
并将其重复为text_2,text_3至n。
我想要的是运行循环并在每个循环中替换文本框名称的数字部分。
像这样{array element } = ui->text_{This number getting changed }->text();
如何在qt中完成?
答案 0 :(得分:7)
有两种方法可以做到这一点。
创建用户界面时,不是使用text1
,text2
等,而是创建一个QLineEdit
的数组(例如。std::vector<QLineEdit>
)和然后当你想要检索它们的值时,只需遍历这个数组
迭代容器小部件的子代。您可以使用以下内容获取子项列表(documentation):
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();
}