QVariant的多态性

Artoon

我有两个这样的课程:

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

为什么为foonull?QVariant让多态性,因为我没有问题object

温特穆特

因为Foo它不是派生的,QObject并且QVariant仅支持QObject派生类型的多态

QVariant :: value文档中

如果QVariant包含指向从QObject派生的类型的指针,则T可以是任何QObject类型。如果存储在QVariant中的指针可以qobject_cast到T,则返回该结果。否则,将返回空指针。请注意,这仅适用于使用Q_OBJECT宏的QObject子类。

(强调我的)。在后面QVariant::canConvert引用的部分中对此进行了重新定义,而指针转换没有其他内容。QVariant根本不支持您的情况。

好处是,如果您Foo是的子类QObject,则不必再费心Q_DECLARE_METATYPE了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章