2010-10-03 5 views
0

У меня есть форма с fiels, комбо и т.д. Я хотел бы перейти через все виджеты на форме и если, например, это текстовое поле, ясно, что, что-то вроде этого:Qt: как очистить поля формы?

foreach(QObject *child, this->ui->children()) 
{ 
    QLineEdit *txtField = qobject_cast<QLineEdit *>(child); 
    if (txtField) 
    { 
     txtField->clear(); 
    } 
} 

Проблема заключается в Объект ui не имеет такого свойства, как дети, и я не знаю, как получить всю коллекцию детских виджетов.

Возможно, объект формы имеет что-то вроде метода Clear. Это было бы лучше.

Благодаря

ответ

5

Попробуйте.

foreach(QLineEdit *widget, this->findChildren<QLineEdit*>()) { 
    widget->clear(); 
} 
+0

Да, это сработало для меня, спасибо! Но мне пришлось удалить setupUi-код, потому что у формы есть некоторые странные дополнительные виджеты внутри. Полагаю, мне это не нужно, потому что этот метод был вызван раньше. – mimic

+0

Код 'setupUi' на самом деле не существует ... Не имеет смысла очищать форму сразу после инициализации - и вызов setupUi более одного раза может привести к утечке памяти. –

+0

@ TomášZato Я согласен. Я не уверен, почему я его там положил. Может быть, сказать, что его нужно называть где-то раньше. – wrongite

2

Сколько QLineEdit s мы говорим? Если не хорошая причина, я бы просто добавить метод класса, который имеет ui в качестве члена и сделать это вручную, как это:

void clearform() 
{ 
    this->ui->firstlineedit->clear(); 
    this->ui->secondlineedit->clear(); 
    ... 
    this->ui->nthlineedit->clear(); 
} 

Хорошая причина, почему вы не можете сделать это таким образом, что QLineEdit s динамически добавляются, и вы не имеете их в качестве членов. В этом случае вы можете вызвать QObject::children на виджет, который является родительским для всех ваших QLineEdit s, если они имеют общее имя, QObject::findChildren также будет работать.