Ruslan F.
Ruslan F.

Reputation: 5776

QVariant cast to base type

I have some class like this:

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

When this class was stored to QVariant such behaviour 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)

Is there any way to store it in QVariant and be able to get it as QObject* and QObjectDerived*?

Upvotes: 3

Views: 1650

Answers (2)

Amartel
Amartel

Reputation: 4286

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 * is stored as a built-in QMetaType::QObjectStar type, and QObjectDerived is a user-defined type with id, defined by Meta-type system. Which means, you'll have to cast it manually.

Upvotes: 0

Toby Speight
Toby Speight

Reputation: 30706

Only by writing

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

It may be possible to partially specialize qvariant_cast for your type, but that's not a documented supported use case, and I'd be reluctant to rely on it.

Upvotes: 1

Related Questions