我有两个这样的课程:
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
null?QVariant
让多态性,因为我没有问题object
因为Foo
它不是派生的,QObject
并且QVariant
仅支持QObject
派生类型的多态。
如果QVariant包含指向从QObject派生的类型的指针,则T可以是任何QObject类型。如果存储在QVariant中的指针可以qobject_cast到T,则返回该结果。否则,将返回空指针。请注意,这仅适用于使用Q_OBJECT宏的QObject子类。
(强调我的)。在后面QVariant::canConvert
引用的部分中对此进行了重新定义,而指针转换没有其他内容。QVariant
根本不支持您的情况。
好处是,如果您Foo
是的子类QObject
,则不必再费心Q_DECLARE_METATYPE
了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句