2015-09-28 2 views
0

У меня есть такая иерархия классов:QVariant пользовательских классов полиморфизм

class Base { 
... 
virtual QWidget* getEditor(); 
... 
} 

class Derived { 
... 
QWidget* getEditor() Q_DECL_OVERRIDE; 
... 
} 

Оба класса регистрируется с помощью Q_DECLARE_METATYPE()

я получаю экземпляр базового класса из QVariant. Можно ли получить указатель от QVariant, чтобы иметь возможность вызывать getEditor() из производного объекта?

Я пытаюсь это атм, но не имею никакого успеха:

if (index.data(Qt::EditRole).canConvert<Base>()) 
    return index.data(Qt::EditRole).value<Base>().getEditor(parent); 

Этот Snipper вызывающего метод класса Base.

ответ

1

Вы должны сделать свой базовый класс функция virtual для включения полиморфизма:

class Base { 
... 
virtual QWidget* getEditor(); 
... 
} 

class Derived { 
... 
QWidget* getEditor() Q_DECL_OVERRIDE; 
... 
} 

Кроме того, как вы его теперь будет вызывать object slicing. Вам нужно будет получить указатель на Derived и вызвать функцию на этом указателе.

+0

Отредактировано мое сообщение. Вопрос в том, как мне получить указатель от QVariant :: value <>() – Eckler

+0

@Eckler, чтобы получить указатель из 'QVariant', вы должны сначала сохранить этот указатель в' QVariant', поэтому, видимо, вам придется изменить свой код для хранения указателей, а не объектов. – SingerOfTheFall

+0

Должен ли я изменить Q_DECLARE_METATYPE (Base) на Q_DECLARE_METATYPE (Base *) в этом случае? – Eckler

Смежные вопросы