Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Андрей от Сентябрь 11, 2012, 18:34



Название: Избегание постоянного использования dynamic_cast
Отправлено: Андрей от Сентябрь 11, 2012, 18:34
     В проекте использую очень много dynamic_cast. По сути можно его и не использовать, что я и хочу сделать. Во многих случаях у объекты возвращают тип перечислением, и можно использовать static_cast.
    Но в одном месте так делать нельзя...

    Есть несколько виджетов, которые можно перетаскивать мышкой. Тип у всех разный. Общего предка кроме Qt-тишных нет. Допустим один наследую от QLabel, другой от QFrame.
При идентификации объекта, который был захвачен мышью, делать много dynamic_cast совсем стрёмно.

    Решил использовать Q_PROPERTY для получения типа объекта, вроде, работает.

   Это нормальный вариант или есть другие способы?


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: Igors от Сентябрь 11, 2012, 19:14
Использование пропердей "не хуже остальных", а действительно хороший способ мне неизвестен. Нормально полагать что таскаемое мышей есть QWidget и задействовать его методы


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: Андрей от Сентябрь 11, 2012, 19:26
Ещё был вариант с множественным наследованием, когда один из предков (искусственный) имел бы функцию, возвращающую тип.


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: Bepec от Сентябрь 11, 2012, 20:37
Та зачем тип? Перетаскивается и ладно :)
PS а так по идее проперти ничем не хуже динамика :)


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: LisandreL от Сентябрь 11, 2012, 20:41
Есть ещё вариант object->metaObject()->className().

Так же для наследников QObject есть qobject_cast, который работает быстрее dynamic_cast и даже, по идее, при отключенном RTTI (не пробовал).

А вообще почему так уж хочется избавиться от dynamic_cast? Неужели это критично по производительности? Или просто хочется и всё тут?


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: Igors от Сентябрь 11, 2012, 21:15
Ещё был вариант с множественным наследованием, когда один из предков (искусственный) имел бы функцию, возвращающую тип.
А смысл? В приведенном Вами примере (таскание мышей) не видно зачем Вам мучительно определять тип, любой QWidget может быть перенесен


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: Akon от Сентябрь 13, 2012, 11:40
А чем в вашем случае плох dynamic_cast/qobject_cast?

В способе идентификации типа по перечислению есть один, иногда критичный, недостаток - нельзя отследить граф наследования. Что бы это сделать нужно использовать уже флаги или список.

Идентификация типа по перечислению, как правило, используетмся, когда важна производительность (нпример, QEvent). Для гуя это неактуально.


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: Андрей от Сентябрь 14, 2012, 17:09
   В примере Qt делается static_cast . Я пишу модуль по этому шаблону.
Хотя лучшим решением (в рамках шаблона) будет привести всё к общему знаменателю и сделать виджеты всё-таки одного типа. В отличие от примера, я ещё проверяю тип виджета, на который отпускаю захваченный виджет и произвожу действия в зависимости от этого типа. Думаю, не я первый это делаю)))
  dynamic_cast работает. По идее ограничения по производительности не стоит. Но захотелось потренироваться.
  qobject_cast пробовал. Что-то не пошло. Он, вроде, не преобразует в объекты пользовательских типов, наследуемых от QObject, только в чистые Qt-классы.
 А вот object->metaObject()->className() неплохой вариант.


Название: Re: Избегание постоянного использования dynamic_cast
Отправлено: LisandreL от Сентябрь 14, 2012, 21:43
qobject_cast пробовал. Что-то не пошло. Он, вроде, не преобразует в объекты пользовательских типов, наследуемых от QObject, только в чистые Qt-классы.
Преобразует, по крайней мере если пользовательский тип объявлен с Q_OBJECT.