2015-05-26 3 views
3

У меня есть некоторый класс, как это:QVariant приведение к базовому типу

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

Когда этот класс был сохранен в QVariant такое поведение встречается,

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, определенный системой Meta-type. Это означает, что вам нужно будет вручную его вручную.

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