QVariant强制转换为基类型
QVariant cast to base type
我有一些像这样的类:
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*?
只写
QObject *value = variant.value<QObjectDerived*>();
它可能可以为您的类型部分专门化qvariant_cast
,但这不是文档支持的用例,我不愿意依赖它。
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的自定义类型。这意味着,您必须手动强制转换它。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 为什么允许dynamic_cast到非唯一的基类类型?
- 基类类型向量中的派生结构
- C++ 模板:重载时找不到基类类型参数方法
- 如果类包含基类类型的成员作为第一个元素,后跟其他成员,编译器是否可以优化空基?
- 如何在不转换回基类类型的情况下返回派生类型的对象?
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- 获取继承基类类型的元组
- 如何从指针调用派生类函数到基类类型 (C++)
- 如何检查对象是否是基类类型
- 来自存储在带有基类类型的地图中的派生类的调用函数
- 采用基类类型参数的虚拟函数
- 用派生类填充基类类型的2D矢量
- 基类类型的指针忘记了原始对象类型
- 在c++中推回基类类型2d vector中的子类对象
- 子类对象,用作定义为c++基类类型的参数
- 从基类类型的向量访问派生类方法
- 从基类类型的指针数组调用派生类的方法.(c++)