Russian Qt Forum

Qt => Общие вопросы => Тема начата: burevestnik от Январь 16, 2012, 13:07



Название: Как сделать приведение типа QObject* -> MyClass*
Отправлено: 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 ?



Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: Пантер от Январь 16, 2012, 13:09
Код:
MyClass1 *my = qobject_cast <MyClass1*> (ptr);
Q_CHECK_PTR (my);


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: interv от Январь 16, 2012, 13:09
или
Код:
QObject *obj = new MyClass(a,b,c,d);
MyClass *cls = (MyClass*)obj;


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: burevestnik от Январь 16, 2012, 13:10
а если там будет MyClass2 ?


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: Пантер от Январь 16, 2012, 13:11
или
Код:
QObject *obj = new MyClass(a,b,c,d);
MyClass *cls = (MyClass*)obj;
Так делать плохо.

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


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: interv от Январь 16, 2012, 13:11
вроде пример Пантер'а вернет 0

MyClass1 *my = qobject_cast <MyClass1*> (ptr);
if (my==0)
  return;


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: burevestnik от Январь 16, 2012, 13:13
Ребята!!!! мне нужно привести-то к типу name1 !!!!! какой тип мне className вернет, к тому и нужно приводить!!!!


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: interv от Январь 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);
  ...
}


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: mutineer от Январь 16, 2012, 13:16
Ребята!!!! мне нужно привести-то к типу name1 !!!!! какой тип мне className вернет, к тому и нужно приводить!!!!

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

Блин, что ж у вас за задачи такие постоянно...


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: kambala от Январь 16, 2012, 13:18
ты лучше скажи какую цель этим преследуешь - может есть варианты получше.


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: interv от Январь 16, 2012, 13:20
можно создать класс MyClass с абстрактным методом, переопределть его в MyClass1 и MyClass2
и
Код:
MyClass *my = qobject_cast <MyClass*> (ptr); 
if (my)
  my.MyAbstractMethod();
так условий не нужно


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: burevestnik от Январь 16, 2012, 13:25
у меня есть штук тридцать (пока, потом будет штук сто) разных пользовательских форм. Они наследуются от одной базвой формы и есть еще пара-тройка уровней наследников. На самом последнем уровне, добавляются всякие кнопки.
Вот мне нужно имея стек на указатели этих форм пройтись по нему, и все кнопки сделать не активными.
Метод qFindChildren<QPushButton*>() работая с базовым типом естественно не находит кнопки, т.к. они добавляются  ниже.
значит надо делать понижающее приведение....


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: mutineer от Январь 16, 2012, 13:30
Сделай у базовой формы метод setButtonsInactive(), переопредели его у форм-наследников. И вызывай у каждой формы этот метод


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: interv от Январь 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, и наследуеш все формы от него. Все...


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: kambala от Январь 16, 2012, 13:47
Код
C++ (Qt)
void MyClass.setButtonsInactive(QWidget* wgt=this)
отличная запись

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


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: interv от Январь 16, 2012, 13:58
Тут я не говорил что он абстрактный... ???


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: Fregloin от Январь 17, 2012, 10:58
а почему не использовать dynamic_cast? хотя виртуальные функции здесь как раз кстати.


Название: Re: Как сделать приведение типа QObject* -> MyClass*
Отправлено: Exproment от Январь 17, 2012, 16:24
я бы создал общего родителя "MyClass", определил бы в нем чисто виртуальный метод int Type(); и во всех наследниках его реализовал...

Затем Switch от типа и по case - с помощью static_cast все прекрасно преобразуешь... считаю это наиболее безопасным. Вообще динамическое приведение - не гуд. Если можно избавится - нужно избавится ) по многим причинам.

Причем в самом Qt обычно так и реализовано (на примере QGaphicsObject)