4

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

但是,我注意到有些人写了qRegisterMetaType<Foo*>();这是否等效?或者如果我想使用指针,我是否必须两者都做Foo

那么这有意义吗?

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

如何在从 QObject 派生的类上正确使用qRegisterMetaType , 但不完全

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

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

我的课程如下所示:

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]

所以注册为指针似乎做了一些不同的事情。在我的特殊情况下,我无法同时注册两者。

4

2 回答 2

1

不,它们不相等。 Foo并且Foo*是不同的类型,需要单独注册。如果您只想使用元类型系统存储指向 Foo 的指针,请使用qRegisterMetaType<Foo *>();. 如果你想要两者,然后注册两个。

通常,如果您的类不能被复制,您只会注册指针形式,例如QObject和派生类的情况,但这取决于您的要求。

于 2013-10-15T11:58:58.847 回答
0

正如您从Qt 文档中看到的那样,您应该传递要注册的类的类型。不是指向此类型的指针。

我不确定,但是如果您想将指针值“序列化”到 QVariant,则传递指针很有用。

于 2013-10-15T11:12:18.583 回答