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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование из QVariant наследуемого типа  (Прочитано 5040 раз)
yoyo
Гость
« : Февраль 15, 2008, 13:46 »

Имеется базовый класс BaseClass (не наследник QObject) с виртуальным методом virtMethod и наследуемый от него ChildClass, с перекрываемым методом virtMethod. Оба класса описаны с Q_DECLARE_METATYPE для возможности сохранять их в QVariant.

Код:
QVariant v = qVariantFromValue(ChildClass());
...
if (qVariantCanConvert<BaseClass>(v)) {
  BaseClass bc = qVariantValue<BaseClass>(v);
  bc.virtMethod();
}

Проблема в том, что qVariantCanConvert всегда будет возвращать false, хотя BaseClass и является родительским. Можно ли обойти этот момент без проверки qVariantCanConvert<ChildClass>(v)?
Записан
Tonal
Гость
« Ответ #1 : Февраль 16, 2008, 13:02 »

В QMetaType нет информации о наследовании и конвертировании.
Так что облом.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Февраль 16, 2008, 14:31 »

Можно перейти на указатели на эти типы. Должно получиться. Т.е.:

Код:
Q_DECLARE_METATYPE(BaseClass *);

...

Q_DECLARE_METATYPE(ChildClass *);


QVariant v = qVariantFromValue(new ChildClass());

...
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vaprele07
Гость
« Ответ #3 : Февраль 16, 2008, 15:25 »

или почитать про qRegisterMetaTypeStreamOperators
Записан
yoyo
Гость
« Ответ #4 : Февраль 16, 2008, 21:39 »

Цитировать
или почитать про qRegisterMetaTypeStreamOperators
Ну, реализую я для своих классов потоковые операции << и >>. Ну, объявлю об этой способности своих классов с помощью функции qRegisterMetaTypeStreamOperators<T>. Конечно, это позволит, в какой-то мере, автоматизировать процесс сохранения моих данных, используя QSettings (даже в виде объектов QVariant). Это красиво, но проблему не снимает. Или я чего-то не понимаю.
Записан
yoyo
Гость
« Ответ #5 : Февраль 16, 2008, 22:48 »

Переход на указатели действительно помог! Только небольшая поправка в коде:
Код:
BaseClass *сс = new ChildClass();
QVariant v = qVariantFromValue(сc);
Спасибо pastor и всем откликнувшимся!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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