Всем Здравствовать !
После создания динамической формы, ( http://www.forum.crossplatform.ru/index.php?showtopic=10120 )
возникла проблема её опроса на предмет child-ов и их динамич-х св-в.
QObjectList ol = formUI->children();
for (i = 0;i < ol.count();i++)
qDebug() << ol.at(i)->dynamicPropertyNames();
В том случае, если на форме только "простые" элементы, как то QLabel, QLineEdit и т д, проблем нет,
но в случае если есть что-то типа QTabWidget, т.е. контейнер, в список child-ов ес-сно попадает только
он. О том, где можно опросить child-а что он контейнер, я не нашёл, разве-что по имени, что не совсем
кузяво, т.к. в Дизайнере это имя может быть изменено ("tabWidget" , "tabWidget_2" "tabWidget_4" ... ).
Вопрос в том, можно-ли получить всех child-ов на форме, невзирая на контейнеры одним вызовом,
как это сделано выше, либо определить что он контейнер, но не по имени ???
Хм, может я что-то не допонял, но что мешает пройтись с помощью const QObjectList & QObject::children () const?
Пока так и делаю, но это не то решение что нужно, а мешает
("tabWidget" , "tabWidget_2" "tabWidget_4" ... ) и невозможность
определить контейнер. В диалоге с tabWidget-ом, всего 1 child, - tabWidget_XXX :-(
Все остальные child-ы на нём ...
А если на одной из вкладок будет ещё один tabWidget_ХХХ или QToolBox ? Что тогда делать ?
Теоретически любой объект может быть контейнером, поэтому вам просто нужно рекурсивно опрашивать всех детей.
Так или иначе вам придется спрашивать имя, чтобы отделить например Layout'ы.
Но ничего плохого в этом не вижу .) Вы же получаете dynamicPropertyNames.
А что насчет этого? bool QObject::isWidgetType () const
К сожалению не подходит, т.к. он отвечает о Widget-е а не контейнере ...
Ну так, layout не является виджетом и таким образом ты их отсеешь.
Дык мне нужно, как указано в 1-й месаге ветки, определить Контейнеры,
для их дальнейшего пока не-рекурсивного опроса на предмет содержащихся в них
Widget-ов и их динамич-х св-в. Делается всё в цикле, и поэтому он уж слишком
громоздким получается ...
Только рекурсивно опрашивать
Нашлось решение, пока объяснял что мне нужно ...
В своём класе реализовать bool isContainer( QObject *obj ) ,
в котором "вшиты" имена контейнеров из Дизайнера.
Не совсем изящное решение, но пока устроит ...
bool fpForm::isWContainer(QObject *wo)
{
if (!wo->isWidgetType())
return false;
QString cn = wo->metaObject()->className();
if (cn == "QToolBox" || cn == "QTabWidget" || cn == "QStackedWidget")
return true;
return false;
}
QFrame, QScrollArea из очевидного. Но вообще вопрос, что считать контейнером
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)