Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Ovoshlook от Мая 27, 2011, 16:08



Название: Узнать какой класс у widget
Отправлено: Ovoshlook от Мая 27, 2011, 16:08
Очередной вопрос от имени меня))
В общем на Layout лежит widget. каким образом мне узнать какой у этого widget класс?

З.Ы. Сам я конечно знаю какого класса widget я положил,но хотелось бы сразу написать более менее общую функцию для поиска. Да и вообще по типам я еще не брался сравнивать.


Менее обобщенно задача звучит так:
На определенном компоновщике есть виждет чекбокс. Если свойство этого виджета равно true то я удаляю компанощик вместе с виджетом.

Таким образом  задача сводится к следующему:
а) Узнать класс виджета (чекбокс или не чекбокс)
2) Если это чекбокс то надо посмотреть состояние его свойства isChecked и если оно true то удалить компоновщик вместе с этим виджетом.

Как что удалить я знаю но как проверить какой класс у этого виджета я пока что не совсем понимаю.

Заранее всем спасибо.


Название: Re: Узнать какой класс у widget
Отправлено: GreatSnake от Мая 27, 2011, 16:12
Код
C++ (Qt)
const char * QMetaObject::className () const


Название: Re: Узнать какой класс у widget
Отправлено: kambala от Мая 27, 2011, 17:52
Код
C++ (Qt)
QWidget *someWidget;
QCheckBox *checkBox = qobject_cast<QCheckBox *>(someWidget);
if (checkBox)
{
   // делаешь что надо
}


Название: Re: Узнать какой класс у widget
Отправлено: Ovoshlook от Мая 28, 2011, 20:41
Спасибо за ответы, но появилась очередная проблема. У меня на лайауте не один виджет а несколько. Мне нужно пройтись по лайоуту, найти виджет типа чекбокс и посмотреть его состояние checked.
Я попытался это сделать следующим образом:

Код:
 QCheckBox *item=static_cast<QCheckBox *>(HBoxLayout->itemAt(HBoxLayout->indexOf(CheckBox)));
 if (item->isChecked()==true)

Но в это случае мне выдается ошибка
error: invalid static_cast from type 'QLayoutItem*' to type 'QCheckBox*' что собственно то и понятно, пытаюсь привести к типу объект совершенно другого типа.

Идей как этого избежать у меня больше к сожалению нет. Может кто то имел опыт вытаскивания нужного виджета из лайоута?


Название: Re: Узнать какой класс у widget
Отправлено: madRoger от Мая 28, 2011, 21:11
попробуй так:
Код:
 QCheckBox *item=static_cast<QCheckBox *>(HBoxLayout->itemAt(HBoxLayout->indexOf(CheckBox))->widget());


Название: Re: Узнать какой класс у widget
Отправлено: Ovoshlook от Мая 28, 2011, 21:24
Спасибо. Ошибка пропала) Правда прога крахом закончилась) но это уже другой вопрос) Завтра буду смотреть) Спасибо за помощь)


Название: Re: Узнать какой класс у widget
Отправлено: mutineer от Мая 28, 2011, 21:27
замени static_cast на qobject_cast и после приведения проверяй не нулевой ли указатель


Название: Re: Узнать какой класс у widget
Отправлено: lit-uriy от Мая 29, 2011, 07:35
вообще для поиска виджетов есть такой метод:
QObject::findChildren<>()
посмотрите в аистенте его использование


Название: Re: Узнать какой класс у widget
Отправлено: Ovoshlook от Мая 29, 2011, 15:01
Всем спасибо за помощь. Сделал вот так (так как знаю на каком месте лежит нужный мне виджет) чтобы не загонять в функцию еще одну ссылку:

Код:

 QCheckBox *Seconditem=static_cast<QCheckBox *>(HBoxLayout->itemAt(0)->widget());
        if (Seconditem->isChecked()==true)
            {
              
            }

Хотя с QObject::findChildren<>() было бы правильнее. Если не будет гореть по времени то постараюсь реализовать.

Еще раз всем спасибо за помощь и терпение.


Название: Re: Узнать какой класс у widget
Отправлено: p166 от Июня 01, 2011, 11:50
Как вариант:
Код:
QList<QCheckBox *> allCheckBox = HBoxLayout->findChildren<QCheckBox *>();


Название: Re: Узнать какой класс у widget
Отправлено: GreatSnake от Июня 01, 2011, 13:55
Как вариант:
Код:
QList<QCheckBox *> allCheckBox = HBoxLayout->findChildren<QCheckBox *>();
и размер allCheckBox будет 0, т.к. у QLayout нет в потомках виджетов.