qRegisterMetaType - 类,类*或两者

时间:2013-10-15 10:50:06

标签: c++ qt metaclass

通常我会在Qt元系统中注册我的课程,如下所示:qRegisterMetaType<Foo>();

然而,我注意到有些人写qRegisterMetaType<Foo*>();这是等同的吗?或者,如果我想使用Foo指针

,我是否必须同时执行这两项操作

这有什么意义吗?

qRegisterMetaType<Foo>(); qRegisterMetaType<Foo *>();

How to properly use qRegisterMetaType on a class derived from QObject?部分回答,但不完全

- 编辑:到目前为止有趣的答案,谢谢 -

好的,关于到目前为止所说的内容,我得出以下结论:我想将我的类用作指针和值,所以我注册了两者。代码编译。

我的课程如下:

class Foo1 : public Bar {}
class Foo2 : public Bar {}

当我只注册类型时,一切正常:

qRegisterMetaType<Foo1>();
qRegisterMetaType<Foo2>();

但是当我注册时:

qRegisterMetaType<Foo1*>();
qRegisterMetaType<Foo2*>();

代码编译,但在运行时我得到:

QMetaType:registerTypedef: Binary compatibility break -- Type name Bar* previously registered as typedef of Foo1 [1234], now registering as typedef of Foo2 [1235]

因此注册为指针似乎做了不同的事情。我无法在我的特定情况下注册。

2 个答案:

答案 0 :(得分:1)

不,他们不等同。 FooFoo*是不同的类型,需要单独注册。如果您只想使用元类型系统存储指向Foo的指针,请使用qRegisterMetaType<Foo *>();。如果你想要两者,那么注册两者。

通常情况下,如果您的类无法复制,则只会注册指针表单,如QObject及其衍生产品,但这取决于您的要求。

答案 1 :(得分:0)

Qt documentation可以看出,您应该传递要注册的类的类型。不是这种类型的指针。

我不确定,但是如果你想将指针值“序列化”到QVariant,那么传递指针是有用的。