Russian Qt Forum
Ноябрь 24, 2024, 04:00
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Избегание постоянного использования dynamic_cast
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Избегание постоянного использования dynamic_cast (Прочитано 4732 раз)
Андрей
Гость
Избегание постоянного использования dynamic_cast
«
:
Сентябрь 11, 2012, 18:34 »
В проекте использую очень много dynamic_cast. По сути можно его и не использовать, что я и хочу сделать. Во многих случаях у объекты возвращают тип перечислением, и можно использовать static_cast.
Но в одном месте так делать нельзя...
Есть несколько виджетов, которые можно перетаскивать мышкой. Тип у всех разный. Общего предка кроме Qt-тишных нет. Допустим один наследую от QLabel, другой от QFrame.
При идентификации объекта, который был захвачен мышью, делать много dynamic_cast совсем стрёмно.
Решил использовать Q_PROPERTY для получения типа объекта, вроде, работает.
Это нормальный вариант или есть другие способы?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Избегание постоянного использования dynamic_cast
«
Ответ #1 :
Сентябрь 11, 2012, 19:14 »
Использование пропердей "не хуже остальных", а действительно хороший способ мне неизвестен. Нормально полагать что таскаемое мышей есть QWidget и задействовать его методы
Записан
Андрей
Гость
Re: Избегание постоянного использования dynamic_cast
«
Ответ #2 :
Сентябрь 11, 2012, 19:26 »
Ещё был вариант с множественным наследованием, когда один из предков (искусственный) имел бы функцию, возвращающую тип.
Записан
Bepec
Гость
Re: Избегание постоянного использования dynamic_cast
«
Ответ #3 :
Сентябрь 11, 2012, 20:37 »
Та зачем тип? Перетаскивается и ладно
PS а так по идее проперти ничем не хуже динамика
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Избегание постоянного использования dynamic_cast
«
Ответ #4 :
Сентябрь 11, 2012, 20:41 »
Есть ещё вариант object->metaObject()->className().
Так же для наследников QObject есть qobject_cast, который работает быстрее dynamic_cast и даже, по идее, при отключенном RTTI (не пробовал).
А вообще почему так уж хочется избавиться от dynamic_cast? Неужели это критично по производительности? Или просто хочется и всё тут?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Избегание постоянного использования dynamic_cast
«
Ответ #5 :
Сентябрь 11, 2012, 21:15 »
Цитата: Андрей от Сентябрь 11, 2012, 19:26
Ещё был вариант с множественным наследованием, когда один из предков (искусственный) имел бы функцию, возвращающую тип.
А смысл? В приведенном Вами примере (таскание мышей) не видно зачем Вам мучительно определять тип, любой QWidget может быть перенесен
Записан
Akon
Гость
Re: Избегание постоянного использования dynamic_cast
«
Ответ #6 :
Сентябрь 13, 2012, 11:40 »
А чем в вашем случае плох dynamic_cast/qobject_cast?
В способе идентификации типа по перечислению есть один, иногда критичный, недостаток - нельзя отследить граф наследования. Что бы это сделать нужно использовать уже флаги или список.
Идентификация типа по перечислению, как правило, используетмся, когда важна производительность (нпример, QEvent). Для гуя это неактуально.
Записан
Андрей
Гость
Re: Избегание постоянного использования dynamic_cast
«
Ответ #7 :
Сентябрь 14, 2012, 17:09 »
В примере Qt делается static_cast . Я пишу модуль по этому шаблону.
Хотя лучшим решением (в рамках шаблона) будет привести всё к общему знаменателю и сделать виджеты всё-таки одного типа. В отличие от примера, я ещё проверяю тип виджета, на который отпускаю захваченный виджет и произвожу действия в зависимости от этого типа. Думаю, не я первый это делаю)))
dynamic_cast работает. По идее ограничения по производительности не стоит. Но захотелось потренироваться.
qobject_cast пробовал. Что-то не пошло. Он, вроде, не преобразует в объекты пользовательских типов, наследуемых от QObject, только в чистые Qt-классы.
А вот object->metaObject()->className() неплохой вариант.
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Избегание постоянного использования dynamic_cast
«
Ответ #8 :
Сентябрь 14, 2012, 21:43 »
Цитата: Андрей от Сентябрь 14, 2012, 17:09
qobject_cast пробовал. Что-то не пошло. Он, вроде, не преобразует в объекты пользовательских типов, наследуемых от QObject, только в чистые Qt-классы.
Преобразует, по крайней мере если пользовательский тип объявлен с Q_OBJECT.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...