Russian Qt Forum
Ноябрь 26, 2024, 11:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Приведение типов  (Прочитано 18450 раз)
pakulo
Гость
« : Май 13, 2007, 20:32 »

Какая разница между
QWidget *widget = qobject_cast<QWidget *>(objectSender);

и
QWidget *widget = (QWidget *)(objectSender);
Записан
Alex Forth
Гость
« Ответ #1 : Май 13, 2007, 20:50 »

Первый использует метаобьектную ситему Qt и возвратит 0, если преобразование невозможно, а второй просто позволяет преобразовать что-то размером в 4 байта(на х86) к типу QWidget *.
Записан
pakulo
Гость
« Ответ #2 : Май 13, 2007, 21:58 »

Первым способом я могу преобразовать если создал свой виджет?

добавлено спустя 31 минуту:

 у меня есть клас
class MyLabel: public QLabel
{
}

делаю
MyLabel *lb;
QLabel *label = qobject_cast<QLabel *>(lb);

как мне получить 0?
Записан
Lion
Гость
« Ответ #3 : Май 13, 2007, 22:18 »

Если Mylasbel не наследник QLabel, то получишь ноль.
Записан
pakulo
Гость
« Ответ #4 : Май 13, 2007, 22:41 »

Ну это понятно... меня интересует как получить 0 если он наследник, см. мой пример...
Записан
QCasper
Гость
« Ответ #5 : Май 13, 2007, 23:06 »

Цитата: "pakulo"
Ну это понятно... меня интересует как получить 0 если он наследник, см. мой пример...


Если lb == 0 то и label тоже будет 0.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Май 13, 2007, 23:33 »

MyLabel *lb;
QLabel *label = !(qobject_cast<QLabel *>(lb));

?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pakulo
Гость
« Ответ #7 : Май 13, 2007, 23:44 »

Просто вот такая проблема
у меня есть два обьекта
MyLabel *lb;
QLabel *label;

в функцию передается QObject *
и мне в функции нужно проверить если это MyLabel сделать то-то, если QLabel те-то...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Май 13, 2007, 23:55 »

Цитата: "pakulo"
Просто вот такая проблема
у меня есть два обьекта
MyLabel *lb;
QLabel *label;

в функцию передается QObject *
и мне в функции нужно проверить если это MyLabel сделать то-то, если QLabel те-то...


Можно заюзать например такое:

Код:
...
QString name(obj->metaObject()->className());

if ( name == "MyLabel" ) {
    <do_something>
    return;
}

if ( name == "QLabel" ) {
    <do_something_else>
    return;
}
...
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Tonal
Гость
« Ответ #9 : Май 14, 2007, 08:29 »

Цитата: "pakulo"
Просто вот такая проблема
у меня есть два обьекта
MyLabel *lb;
QLabel *label;

в функцию передается QObject *
и мне в функции нужно проверить если это MyLabel сделать то-то, если QLabel те-то...

Именно для таких случаев в С++ существует dynamic_cast.
Он работает для классов у которых есть хотя бы одна виртуальная функция и только при включенном rtti.
В Qt ты можешь воспользоваться qobject_cast - это то же самое, что и стандартный dynamic_cast, но можно не включать rtti - Qt его эмулирует самостоятельно. qobject_cast работает только для наследников QObject, и  макрос Q_OBJECT должен быть. Иначе никто не гарантирует, что он вернёт. ;-)

P.S. Я предпочитаю использовать dynamic_cast как более универсальное средство. ;-)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Май 14, 2007, 08:44 »

Тогда наверно так:

MyLabel *lb;
QLabel *label = dynamic_cast<MyLabel *>(lb);

label будет = 0, если lb не объект класса MyLabel.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
vregess
Гость
« Ответ #11 : Май 19, 2007, 11:45 »

Информацию об объекте типа получают с помощью оператора typeid (нужно прицепить заголовок <typeinfo>).

Код:

 typeid(_MY_OBJECT_)

Здесь возвращается ссылка на объект типа type_info, который описывает тип объекта _MY_OBJECT_

Вторая форма:
Код:

 typeid(ИМЯ_ТИПА)

Ну тут понятно - type_info описывает тип ИМЯ_ТИПА. Эту форму можно использовать в инструкциях
сравнения типов.

(QWidget *)(objectSender) - это в Си. В С++ нужно использовать (по стандарту) различные *_cast.

Цитата: "pakulo"
Просто вот такая проблема
у меня есть два обьекта
MyLabel *lb;
QLabel *label;

в функцию передается QObject *
и мне в функции нужно проверить если это MyLabel сделать то-то, если QLabel те-то...



Код:

#include<typeinfo>
...
MyLabel *lb;
QLabel *label;
...
void BlaClass::doIt(QObject *o)
{
 if(typeid(o)==typeid(QLabel)){
   // do something
 }
 else if(typeid(o)==typeid(MyLabel)){
   // do something
 }
 else{
 // what a fuck?!
 }
}

Сам не проверял, но должно работать).
Вроде так. Если я ошибаюсь, было бы интересно услышать - где.
Записан
SABROG
Гость
« Ответ #12 : Май 19, 2007, 12:13 »

А еще можно зарегистрировать свой MetaType:

Код:

Q_DECLARE_METATYPE(MyType)
struct MyType
{
    int id;
    QString str;
};
qRegisterMetaType<MyType>("MyType");
QVariant var = index.data(Qt::UserRole);
if ( var.canConvert<MyType>() )
{
MyType mt = var.value<MyType>();
model->setData(index, QVariant(qVariantFromValue(mt)), Qt::UserRole);
}
else ...
Записан
kitov
Гость
« Ответ #13 : Май 19, 2007, 13:00 »

Цитата: "Tonal"
Цитата: "pakulo"
Просто вот такая проблема
у меня есть два обьекта
MyLabel *lb;
QLabel *label;

в функцию передается QObject *
и мне в функции нужно проверить если это MyLabel сделать то-то, если QLabel те-то...

Именно для таких случаев в С++ существует dynamic_cast.
Он работает для классов у которых есть хотя бы одна виртуальная функция и только при включенном rtti.
В Qt ты можешь воспользоваться qobject_cast - это то же самое, что и стандартный dynamic_cast, но можно не включать rtti - Qt его эмулирует самостоятельно. qobject_cast работает только для наследников QObject, и  макрос Q_OBJECT должен быть. Иначе никто не гарантирует, что он вернёт. ;-)

P.S. Я предпочитаю использовать dynamic_cast как более универсальное средство. ;-)


Для классов унаследованныx от QObject я бы предпочел
qobject_cast - быстрее ( ибо без rtti)
Записан
Tonal
Гость
« Ответ #14 : Май 21, 2007, 10:10 »

Цитата: "kitov"
Для классов унаследованныx от QObject я бы предпочел
qobject_cast - быстрее ( ибо без rtti)
Есть реальные цифры?
На основании чего делается вывод, о тормознутости dynamic_cast по сравнению с qobject_cast
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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