Russian Qt Forum

Qt => Общие вопросы => Тема начата: yoyo от Февраль 15, 2008, 13:46



Название: Преобразование из QVariant наследуемого типа
Отправлено: 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)?


Название: Re: Преобразование из QVariant наследуемого типа
Отправлено: Tonal от Февраль 16, 2008, 13:02
В QMetaType нет информации о наследовании и конвертировании.
Так что облом.


Название: Re: Преобразование из QVariant наследуемого типа
Отправлено: pastor от Февраль 16, 2008, 14:31
Можно перейти на указатели на эти типы. Должно получиться. Т.е.:

Код:
Q_DECLARE_METATYPE(BaseClass *);

...

Q_DECLARE_METATYPE(ChildClass *);


QVariant v = qVariantFromValue(new ChildClass());

...


Название: Re: Преобразование из QVariant наследуемого типа
Отправлено: vaprele07 от Февраль 16, 2008, 15:25
или почитать про qRegisterMetaTypeStreamOperators


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


Название: Re: Преобразование из QVariant наследуемого типа
Отправлено: yoyo от Февраль 16, 2008, 22:48
Переход на указатели действительно помог! Только небольшая поправка в коде:
Код:
BaseClass *сс = new ChildClass();
QVariant v = qVariantFromValue(сc);
Спасибо pastor и всем откликнувшимся!