C++ QVariant转换为基本类型

C++ QVariant转换为基本类型,c++,qt4,C++,Qt4,我有这样的课: class QObjectDerived : public QObject { Q_OBJECT // ... }; Q_DECLARE_METATYPE(QObjectDerived*) 当将此类存储到QVariant时,就会发生这种行为 QObjectDerived *object = new QObjectDerived(this); QVariant variant = QVariant::fromValue(object); qDebug(

我有这样的课:

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)
QObjectDerived*object=新的QObjectDerived(此);
QVariant=QVariant::fromValue(对象);
qDebug()仅通过写入

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

对于您的类型,可以部分专门化
qvariant\u cast
,但这不是一个有文档支持的用例,我不愿意依赖它。

qvariant.h(Qt 4.8.6):

模板
内联T值()常量
{返回qvariant_cast(*this);}

模板内联T qvariant_cast(常量qvariant&v)
{
const int vid=qMetaTypeId(静态_cast(0));
if(vid==v.userType())
return*reinterpret_cast(v.constData());
if(vid
QObject*
存储为内置的
QMetaType::QObjectStar
类型,而
QObjectDerived
是用户定义的id类型,由元类型系统定义。也就是说,您必须手动强制转换它

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();
}