2015-05-26 69 views
3

我有一些類是這樣的:的QVariant轉換爲基類型

class QObjectDerived : public QObject 
{ 
    Q_OBJECT 
    // ... 
}; 
Q_DECLARE_METATYPE(QObjectDerived*) 

當這個類被存儲到的QVariant這種行爲occures

QObjectDerived *object = new QObjectDerived(this); 
    QVariant variant = QVariant::fromValue(object); 
    qDebug() << variant;       // prints QVariant(QObjectDerived*,) 
    qDebug() << variant.value<QObject*>();  // prints QObject(0x0) 
    qDebug() << variant.value<QObjectDerived*>(); // QObjectDerived(0x8c491c8) 

    variant = QVariant::fromValue(static_cast<QObject*>(object)); 
    qDebug() << variant;       // prints QVariant(QObject*, QObjectDerived(0x8c491c8)) 
    qDebug() << variant.value<QObject*>();  // prints QObjectDerived(0x8c491c8) 
    qDebug() << variant.value<QObjectDerived*>(); // QObject(0x0) 

有沒有辦法將其存儲在的QVariant並能夠得到它作爲QObject *和QObjectDerived *?

回答

1

只有通過寫

QObject *value = variant.value<QObjectDerived*>(); 

可能有可能部分專門qvariant_cast你的類型,但是這不是一個支持文件的使用情況,而且我不願意依靠它。

0

qvariant.h(Qt的4.8.6):

template<typename T> 
inline T value() const 
{ return qvariant_cast<T>(*this); } 

...

template<typename T> inline T qvariant_cast(const QVariant &v) 
{ 
    const int vid = qMetaTypeId<T>(static_cast<T *>(0)); 
    if (vid == v.userType()) 
     return *reinterpret_cast<const T *>(v.constData()); 
    if (vid < int(QMetaType::User)) { 
     T t; 
    if (qvariant_cast_helper(v, QVariant::Type(vid), &t)) 
     return t; 
    } 
    return T(); 
} 

QObject *被存儲爲內置QMetaType::QObjectStar類型,QObjectDerived是一個用戶由元類型系統定義的具有id的定義類型。這意味着,你必須手動投射它。