gpt4 book ai didi

c++ - QVariant 的多态性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:04 28 4
gpt4 key购买 nike

我有两个这样的类:

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 烦恼了。

关于c++ - QVariant 的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27857036/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com