Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Опрос формы о child-ах с контейнерами

Автор: JohnZ 23.9.2014, 15:11

Всем Здравствовать !

После создания динамической формы, ( 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-ов на форме, невзирая на контейнеры одним вызовом,
как это сделано выше, либо определить что он контейнер, но не по имени ???

Автор: OKTA 23.9.2014, 16:48

Хм, может я что-то не допонял, но что мешает пройтись с помощью const QObjectList & QObject::children () const?

Автор: JohnZ 23.9.2014, 18:21

Пока так и делаю, но это не то решение что нужно, а мешает
("tabWidget" , "tabWidget_2" "tabWidget_4" ... ) и невозможность
определить контейнер. В диалоге с tabWidget-ом, всего 1 child, - tabWidget_XXX :-(
Все остальные child-ы на нём ...
А если на одной из вкладок будет ещё один tabWidget_ХХХ или QToolBox ? Что тогда делать ?

Автор: lanz 23.9.2014, 19:12

Теоретически любой объект может быть контейнером, поэтому вам просто нужно рекурсивно опрашивать всех детей.
Так или иначе вам придется спрашивать имя, чтобы отделить например Layout'ы.
Но ничего плохого в этом не вижу .) Вы же получаете dynamicPropertyNames.

Автор: JohnZ 24.9.2014, 0:11

Цитата(lanz @ 23.9.2014, 19:12) *
Теоретически любой объект может быть контейнером, поэтому вам просто нужно рекурсивно опрашивать всех детей.

КанЭшна может, но вотЪ признака, типа bool isContainer() к сожалению почему-то не имеет.
Ведь кучу текста можно было-бы сэкономить :-( Видимо придётся допиливать либу :-)
Я предполагал, что кто-либо уже сталкивался с контейнерами, и опрашивал их по-иному, а не по имени ...

Цитата(lanz @ 23.9.2014, 19:12) *
Так или иначе вам придется спрашивать имя, чтобы отделить например Layout'ы.

Дык пока так и делаю, но хотелось сделать более универсальное решение ...

Цитата(lanz @ 23.9.2014, 19:12) *
Но ничего плохого в этом не вижу .) Вы же получаете dynamicPropertyNames.

Да, т.к. исходя именно из dynamicProperty, и строится дальнейший алгоритм ...

Автор: OKTA 24.9.2014, 9:58

А что насчет этого? bool QObject::isWidgetType () const

Автор: JohnZ 24.9.2014, 10:52

К сожалению не подходит, т.к. он отвечает о Widget-е а не контейнере ...

Автор: OKTA 24.9.2014, 10:58

Ну так, layout не является виджетом и таким образом ты их отсеешь.

Автор: JohnZ 24.9.2014, 11:04

Дык мне нужно, как указано в 1-й месаге ветки, определить Контейнеры,
для их дальнейшего пока не-рекурсивного опроса на предмет содержащихся в них
Widget-ов и их динамич-х св-в. Делается всё в цикле, и поэтому он уж слишком
громоздким получается ...

Автор: OKTA 24.9.2014, 11:08

Только рекурсивно опрашивать

Автор: JohnZ 24.9.2014, 11:28

Нашлось решение, пока объяснял что мне нужно ... :D
В своём класе реализовать 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;
}


Кто в курсе, подскажите, что НЕ учтено ???

Автор: lanz 24.9.2014, 18:51

QFrame, QScrollArea из очевидного. Но вообще вопрос, что считать контейнером :D

Автор: JohnZ 25.9.2014, 12:54

Цитата(lanz @ 24.9.2014, 18:51) *
QFrame, QScrollArea из очевидного. Но вообще вопрос, что считать контейнером :D

В новой версии функции учёл ещё QFrame, а QScrollArea нет, т.к. не смог придумать
его приминения в своём проекте :rolleyes:
Контейнером видимо мне придётся считать всё, что юзер сделает контейнером :D
lanz, будет время, загляните plz в ветку "Виджет из QT3 в QT4".

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)