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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как сделать приведение типа QObject* -> MyClass*  (Прочитано 8071 раз)
burevestnik
Гость
« : Январь 16, 2012, 13:07 »

Как сделать приведение типов QObject* -> MyClass* ?

public MyClass1 : public QWidget

class MyClass2 : public QWidget

есть некий указатель QWidget* ptr, он на самом деле ссылается на объект типа MyClass1 или MyClass2.
я могу получить имя класса
char* name1 = ptr->staticMetaObject()->className();

а вот как теперь привести ptr к типу name1 ?

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 16, 2012, 13:09 »

Код:
MyClass1 *my = qobject_cast <MyClass1*> (ptr);
Q_CHECK_PTR (my);
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
interv
Гость
« Ответ #2 : Январь 16, 2012, 13:09 »

или
Код:
QObject *obj = new MyClass(a,b,c,d);
MyClass *cls = (MyClass*)obj;
Записан
burevestnik
Гость
« Ответ #3 : Январь 16, 2012, 13:10 »

а если там будет MyClass2 ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Январь 16, 2012, 13:11 »

или
Код:
QObject *obj = new MyClass(a,b,c,d);
MyClass *cls = (MyClass*)obj;
Так делать плохо.

а если там будет MyClass2 ?
Вернет 0.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
interv
Гость
« Ответ #5 : Январь 16, 2012, 13:11 »

вроде пример Пантер'а вернет 0

MyClass1 *my = qobject_cast <MyClass1*> (ptr);
if (my==0)
  return;
Записан
burevestnik
Гость
« Ответ #6 : Январь 16, 2012, 13:13 »

Ребята!!!! мне нужно привести-то к типу name1 !!!!! какой тип мне className вернет, к тому и нужно приводить!!!!
Записан
interv
Гость
« Ответ #7 : Январь 16, 2012, 13:15 »

лол... по условию... а как иначе. ты же не знаеш какой класс у тя будет...
Код:
char* name1 = ptr->staticMetaObject()->className();
if (name1 == 'MyClass1')
{
  MyClass1 *my = qobject_cast <MyClass1*> (ptr);
  ...
}

if (name1 == 'MyClass2')
{
  MyClass2 *my = qobject_cast <MyClass2*> (ptr);
  ...
}
Записан
mutineer
Гость
« Ответ #8 : Январь 16, 2012, 13:16 »

Ребята!!!! мне нужно привести-то к типу name1 !!!!! какой тип мне className вернет, к тому и нужно приводить!!!!

Ну разве что через цепочку if'ов

Блин, что ж у вас за задачи такие постоянно...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Январь 16, 2012, 13:18 »

ты лучше скажи какую цель этим преследуешь - может есть варианты получше.
Записан

Изучением 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
interv
Гость
« Ответ #10 : Январь 16, 2012, 13:20 »

можно создать класс MyClass с абстрактным методом, переопределть его в MyClass1 и MyClass2
и
Код:
MyClass *my = qobject_cast <MyClass*> (ptr); 
if (my)
  my.MyAbstractMethod();
так условий не нужно
Записан
burevestnik
Гость
« Ответ #11 : Январь 16, 2012, 13:25 »

у меня есть штук тридцать (пока, потом будет штук сто) разных пользовательских форм. Они наследуются от одной базвой формы и есть еще пара-тройка уровней наследников. На самом последнем уровне, добавляются всякие кнопки.
Вот мне нужно имея стек на указатели этих форм пройтись по нему, и все кнопки сделать не активными.
Метод qFindChildren<QPushButton*>() работая с базовым типом естественно не находит кнопки, т.к. они добавляются  ниже.
значит надо делать понижающее приведение....
Записан
mutineer
Гость
« Ответ #12 : Январь 16, 2012, 13:30 »

Сделай у базовой формы метод setButtonsInactive(), переопредели его у форм-наследников. И вызывай у каждой формы этот метод
Записан
interv
Гость
« Ответ #13 : Январь 16, 2012, 13:30 »

дык есть решение...
Код
C++ (Qt)
void MyClass::setButtonsInactive(QWidget* wgt=0)
{
 if (!wgt) wgt = this; // Бывает ))
 for (int i=0; i<wgt->children().size(); ++i)
 {
   QPushButton* trybutton = qobject_cast <QPushButton*> (wgt->children().at(i));
   if (trybutton) {trybutton->setEnabled(false); continue;}
   QWidget* tryWidget = qobject_cast <QWidget*> (wgt->children().at(i));
   if (tryWidget) {setButtonsInactive(tryWidget);}
 }
}
 
 

Сори! была ошибка

Это метод делаеш у наследника QWidget, и наследуеш все формы от него. Все...
« Последнее редактирование: Январь 16, 2012, 13:52 от interv » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Январь 16, 2012, 13:47 »

Код
C++ (Qt)
void MyClass.setButtonsInactive(QWidget* wgt=this)
отличная запись

Автор, не забудь этот абстрактный метод объявить виртуальным.
Записан

Изучением 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
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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