Russian Qt Forum
Августа 30, 2025, 10:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Узнать какой класс у widget  (Прочитано 5688 раз)
Ovoshlook
Гость
« : Мая 27, 2011, 16:08 »

Очередной вопрос от имени меня))
В общем на Layout лежит widget. каким образом мне узнать какой у этого widget класс?

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


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

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

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

Заранее всем спасибо.
« Последнее редактирование: Мая 27, 2011, 16:16 от Ovoshlook » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Мая 27, 2011, 16:12 »

Код
C++ (Qt)
const char * QMetaObject::className () const
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Мая 27, 2011, 17:52 »

Код
C++ (Qt)
QWidget *someWidget;
QCheckBox *checkBox = qobject_cast<QCheckBox *>(someWidget);
if (checkBox)
{
   // делаешь что надо
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #3 : Мая 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*' что собственно то и понятно, пытаюсь привести к типу объект совершенно другого типа.

Идей как этого избежать у меня больше к сожалению нет. Может кто то имел опыт вытаскивания нужного виджета из лайоута?
Записан
madRoger
Гость
« Ответ #4 : Мая 28, 2011, 21:11 »

попробуй так:
Код:
 QCheckBox *item=static_cast<QCheckBox *>(HBoxLayout->itemAt(HBoxLayout->indexOf(CheckBox))->widget());
Записан
Ovoshlook
Гость
« Ответ #5 : Мая 28, 2011, 21:24 »

Спасибо. Ошибка пропала) Правда прога крахом закончилась) но это уже другой вопрос) Завтра буду смотреть) Спасибо за помощь)
Записан
mutineer
Гость
« Ответ #6 : Мая 28, 2011, 21:27 »

замени static_cast на qobject_cast и после приведения проверяй не нулевой ли указатель
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Мая 29, 2011, 07:35 »

вообще для поиска виджетов есть такой метод:
QObject::findChildren<>()
посмотрите в аистенте его использование
Записан

Юра.
Ovoshlook
Гость
« Ответ #8 : Мая 29, 2011, 15:01 »

Всем спасибо за помощь. Сделал вот так (так как знаю на каком месте лежит нужный мне виджет) чтобы не загонять в функцию еще одну ссылку:

Код:

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

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

Еще раз всем спасибо за помощь и терпение.
« Последнее редактирование: Мая 29, 2011, 15:12 от Ovoshlook » Записан
p166
Гость
« Ответ #9 : Июня 01, 2011, 11:50 »

Как вариант:
Код:
QList<QCheckBox *> allCheckBox = HBoxLayout->findChildren<QCheckBox *>();
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Июня 01, 2011, 13:55 »

Как вариант:
Код:
QList<QCheckBox *> allCheckBox = HBoxLayout->findChildren<QCheckBox *>();
и размер allCheckBox будет 0, т.к. у QLayout нет в потомках виджетов.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.035 секунд. Запросов: 20.