QVariant 的多态性
Polymorphism with QVariant
我有两个这样的 类 :
class Foo
{
public:
Foo(int i) : _i(i) {}
int _i;
};
Q_DECLARE_METATYPE(Foo*)
class Bar : public Foo
{
public:
Bar(int i, int j) : Foo(i), _j(j) {}
int _j;
};
Q_DECLARE_METATYPE(Bar*)
我的板凳是这样的:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Bar* bar = new Bar(10,11);
QVariant var = QVariant::fromValue(bar);
Foo * foo = var.value<Foo*>(); // foo IS NULL
QPushButton * b = new QPushButton();
QVariant v = QVariant::fromValue(b);
QObject * object = v.value<QObject*>(); // object IS NOT NULL
return a.exec();
}
为什么 foo
为空?
QVariant
让多态性因为我对 object
没问题
因为 Foo
不是从 QObject
派生的,并且 QVariant
只支持 QObject
派生类型的多态性。
来自QVariant::value documentation:
If the QVariant contains a pointer to a type derived from QObject then T may be any QObject type. If the pointer stored in the QVariant can be qobject_cast to T, then that result is returned. Otherwise a null pointer is returned. Note that this only works for QObject subclasses which use the Q_OBJECT macro.
(强调我的)。这在进一步引用的关于 QVariant::canConvert
的部分中被重新散列,并且没有关于指针转换的其他内容。 QVariant
根本不支持你的场景
好处是,如果您使 Foo
成为 QObject
的子类,您就不必再为 Q_DECLARE_METATYPE
操心了。
问题是没有关于继承的元数据,也没有虚拟table,所以QVariant
没有关于继承的数据。您可以尝试向基 class 添加一些虚拟方法(最好是析构函数),这可能会有所帮助(在这种情况下会有一些 运行 时间数据关于继承)但我不认为它是够了。
与其他答案一样,此功能肯定适用于 QObject
s。
您也可以尝试添加 Q_GADGET
宏来提供元数据,但我怀疑它能否解决问题。
我有两个这样的 类 :
class Foo { public: Foo(int i) : _i(i) {} int _i; }; Q_DECLARE_METATYPE(Foo*)
class Bar : public Foo
{
public:
Bar(int i, int j) : Foo(i), _j(j) {}
int _j;
};
Q_DECLARE_METATYPE(Bar*)
我的板凳是这样的:
int main(int argc, char *argv[]) { QApplication a(argc, argv); Bar* bar = new Bar(10,11); QVariant var = QVariant::fromValue(bar); Foo * foo = var.value<Foo*>(); // foo IS NULL QPushButton * b = new QPushButton(); QVariant v = QVariant::fromValue(b); QObject * object = v.value<QObject*>(); // object IS NOT NULL return a.exec(); }
为什么 foo
为空?
QVariant
让多态性因为我对 object
因为 Foo
不是从 QObject
派生的,并且 QVariant
只支持 QObject
派生类型的多态性。
来自QVariant::value documentation:
If the QVariant contains a pointer to a type derived from QObject then T may be any QObject type. If the pointer stored in the QVariant can be qobject_cast to T, then that result is returned. Otherwise a null pointer is returned. Note that this only works for QObject subclasses which use the Q_OBJECT macro.
(强调我的)。这在进一步引用的关于 QVariant::canConvert
的部分中被重新散列,并且没有关于指针转换的其他内容。 QVariant
根本不支持你的场景
好处是,如果您使 Foo
成为 QObject
的子类,您就不必再为 Q_DECLARE_METATYPE
操心了。
问题是没有关于继承的元数据,也没有虚拟table,所以QVariant
没有关于继承的数据。您可以尝试向基 class 添加一些虚拟方法(最好是析构函数),这可能会有所帮助(在这种情况下会有一些 运行 时间数据关于继承)但我不认为它是够了。
与其他答案一样,此功能肯定适用于 QObject
s。
您也可以尝试添加 Q_GADGET
宏来提供元数据,但我怀疑它能否解决问题。