2015-09-28 38 views
0

我有這樣的類層次結構:的QVariant自定義類多態性

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

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

兩個類都通過Q_DECLARE_METATYPE()註冊

我從獲得的QVariant Base類的實例。是否可以從QVariant獲得指針以便能夠從Derived對象調用getEditor()

我想這樣ATM,但沒有成功:

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

這剪斷調用基類的方法。

回答

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