通常我会在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]
因此注册为指针似乎做了不同的事情。我无法在我的特定情况下注册。
答案 0 :(得分:1)
不,他们不等同。 Foo
和Foo*
是不同的类型,需要单独注册。如果您只想使用元类型系统存储指向Foo的指针,请使用qRegisterMetaType<Foo *>();
。如果你想要两者,那么注册两者。
通常情况下,如果您的类无法复制,则只会注册指针表单,如QObject
及其衍生产品,但这取决于您的要求。
答案 1 :(得分:0)
从Qt documentation可以看出,您应该传递要注册的类的类型。不是这种类型的指针。
我不确定,但是如果你想将指针值“序列化”到QVariant,那么传递指针是有用的。