Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: developer от Июль 19, 2009, 14:18



Название: Узнать тип виджета[РЕШЕНО]
Отправлено: developer от Июль 19, 2009, 14:18
Драсте.
У меня возник маленький вопросик :) :) :).
Как узнать тип виджета, который передается функции если аргумент етой функции абстрактный.
Пример:
// Передаем QStandartItemModel
Код:
void setModel(QAbstractItemModel* model)
{
// здесь нужно узнать настоящий тип model
// и вызвать функцию которая есть только у етого типа модели.
// Насколько я понимаю QAbstractItemModel* не дает доступа до метода который есть только
// у QStandartItemModel*
}


Название: Re: Узнать тип виджета
Отправлено: Rcus от Июль 19, 2009, 14:22
1. При чем тут виджеты?
2. Изменить определение функции нельзя?
3. RTTI


Название: Re: Узнать тип виджета
Отправлено: pastor от Июль 19, 2009, 14:30
Qt Meta-Object System


Название: Re: Узнать тип виджета
Отправлено: lit-uriy от Июль 19, 2009, 14:48
const char * QMetaObject::className () const // Узнать имя класса
и
bool QMetaObject::invokeMethod (...) // Вызвать метод класса


Название: Re: Узнать тип виджета
Отправлено: ритт от Июль 19, 2009, 15:20
bool QMetaObject::invokeMethod (...) // Вызвать метод класса
не метод, а мета-метод. т.е. сигнал / слот / конструктор.

3. RTTI
-1

qobject_cast


Название: Re: Узнать тип виджета
Отправлено: developer от Июль 19, 2009, 15:22
Цитировать
1. При чем тут виджеты?
2. Изменить определение функции нельзя?
3. RTTI

1. Нда действительно - извиняюсь за неточность.
2. Нельзя
3. А как? :)

2lit-uriy:
    ето можно, но хотелось бы привести указатель к нужному типу. Вот тут то и заморочка. Узнать имя класса я могу
Цитировать
const char * QMetaObject::className () const // Узнать имя класса
. Но теперь как привесть указатель model к нужному типу если у меня есть только имя нужного типа (const char)


Цитировать
const char * QMetaObject::className () const // Узнать имя класса
и
bool QMetaObject::invokeMethod (...) // Вызвать метод класса
кстати об етом я не знал. Спасибо ;) ;)


Название: Re: Узнать тип виджета
Отправлено: Rcus от Июль 19, 2009, 15:39
Хм? RTTI это общее понятие, которое включает в себя не только встроенные механизмы языка для идентификации типов во время исполнения (dynamic_cast, typeid и т.д.), но и механизмы библиотек, например в Qt используется как минимум 5 разных систем: QObject, QVariant, QEvent, QGraphicsItem, QStyleOption. Я не стал указывать на qobject_cast напрямую чтобы автор мог подробнее изучить эту тему, а не браться за средство без изучения основ.


Название: Re: Узнать тип виджета
Отправлено: lit-uriy от Июль 19, 2009, 15:48
Можно попробовать по простому, если у тебя ограниченое число наследников:
Код
C++ (Qt)
void setModel(QAbstractItemModel* model)
{
   QStandartItemModel *model = qobject_cast<QStandartItemModel *>(model);
   if (model)
       model->myMethod();
   // Аналогично для другого наследника QAbstractItemModel
}
 


Название: Re: Узнать тип виджета
Отправлено: developer от Июль 19, 2009, 15:56
Наверное так и сделаю. В моем случае действительно немного наследников: 2

Но если их будет много?????
 ??? ??? ??? ???



Название: Re: Узнать тип виджета
Отправлено: developer от Июль 19, 2009, 15:56
Неужели нету способа...


Название: Re: Узнать тип виджета
Отправлено: lit-uriy от Июль 19, 2009, 16:02
>>Но если их будет много?
Я думаю, что хорошая организация классов решает эту задачу. Т.е. использование виртуальных методов. В одной функции mySetModel, вызывать разного типа методы плохая идея, код пёстрый получается не стройный.
Если же ты собираешся вызывать методы, делающие одну и туже работу, то лучше иметь одного прародителя объектов и внём реализовать виртуальный метод. Тогда множество наследников будут работать в одном ключе.