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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Узнать тип виджета[РЕШЕНО]  (Прочитано 7364 раз)
developer
Гость
« : Июль 19, 2009, 14:18 »

Драсте.
У меня возник маленький вопросик Улыбающийся Улыбающийся Улыбающийся.
Как узнать тип виджета, который передается функции если аргумент етой функции абстрактный.
Пример:
// Передаем QStandartItemModel
Код:
void setModel(QAbstractItemModel* model)
{
// здесь нужно узнать настоящий тип model
// и вызвать функцию которая есть только у етого типа модели.
// Насколько я понимаю QAbstractItemModel* не дает доступа до метода который есть только
// у QStandartItemModel*
}
« Последнее редактирование: Июль 21, 2009, 11:25 от developer » Записан
Rcus
Гость
« Ответ #1 : Июль 19, 2009, 14:22 »

1. При чем тут виджеты?
2. Изменить определение функции нельзя?
3. RTTI
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Июль 19, 2009, 14:30 »

Qt Meta-Object System
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июль 19, 2009, 14:48 »

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

Юра.
ритт
Гость
« Ответ #4 : Июль 19, 2009, 15:20 »

bool QMetaObject::invokeMethod (...) // Вызвать метод класса
не метод, а мета-метод. т.е. сигнал / слот / конструктор.

3. RTTI
-1

qobject_cast
Записан
developer
Гость
« Ответ #5 : Июль 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 (...) // Вызвать метод класса
кстати об етом я не знал. Спасибо Подмигивающий Подмигивающий
Записан
Rcus
Гость
« Ответ #6 : Июль 19, 2009, 15:39 »

Хм? RTTI это общее понятие, которое включает в себя не только встроенные механизмы языка для идентификации типов во время исполнения (dynamic_cast, typeid и т.д.), но и механизмы библиотек, например в Qt используется как минимум 5 разных систем: QObject, QVariant, QEvent, QGraphicsItem, QStyleOption. Я не стал указывать на qobject_cast напрямую чтобы автор мог подробнее изучить эту тему, а не браться за средство без изучения основ.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июль 19, 2009, 15:48 »

Можно попробовать по простому, если у тебя ограниченое число наследников:
Код
C++ (Qt)
void setModel(QAbstractItemModel* model)
{
   QStandartItemModel *model = qobject_cast<QStandartItemModel *>(model);
   if (model)
       model->myMethod();
   // Аналогично для другого наследника QAbstractItemModel
}
 
Записан

Юра.
developer
Гость
« Ответ #8 : Июль 19, 2009, 15:56 »

Наверное так и сделаю. В моем случае действительно немного наследников: 2

Но если их будет много?Непонимающий?
 Непонимающий Непонимающий Непонимающий Непонимающий

Записан
developer
Гость
« Ответ #9 : Июль 19, 2009, 15:56 »

Неужели нету способа...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июль 19, 2009, 16:02 »

>>Но если их будет много?
Я думаю, что хорошая организация классов решает эту задачу. Т.е. использование виртуальных методов. В одной функции mySetModel, вызывать разного типа методы плохая идея, код пёстрый получается не стройный.
Если же ты собираешся вызывать методы, делающие одну и туже работу, то лучше иметь одного прародителя объектов и внём реализовать виртуальный метод. Тогда множество наследников будут работать в одном ключе.
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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