On 28/07/2019 07:15, Thiago Macieira wrote:
On Friday, 26 July 2019 17:35:03 PDT Nikos Chantziaras wrote:
I didn't (although I use Q_ENUM, but it does the same job.) But there's
no constructor to put qRegisterMetaType() in. It's an enum. There's no
constructor. Some enums are in a namespace, some are in a class, but
even with an enum that is in a class, users of can just use the enum in
their own signals/slots prior to instantiating the class that declares
the enum. It will stay unregistered until the first instance of the
class is created.
____________________

I meant in the class it's most likely to be used in.

Well, putting it in the class it's most likely to be used in is not good enough, because this results in "it most likely has been registered, but maybe not." To be sure it's registered, you'd have to register it in *every* class it's used in. What if you forget? It doesn't scale. Too error prone. It's much (much!) better to be in a situation where only two cases are possible: it's either *always* registered, or it's *never* registered. There should be no middle-ground.

In case of enums, if the enum is in "globals.h", then "globals.cpp" should be responsible for registering it. Since global initializers can be removed by the linker as they're not referenced in the executable, then I'll just have to provide initialization functions and call them in main(). That way the qRegisterMetatype() calls stay within the source file of the "owner" of the type, and forgetting to register newly added types is less likely.


This is only required when referring to it by name, such as in old-style
signal-slot connection, QML, D-Bus, etc.

They're new-style connections, but are sometimes of QueuedConnection type since some connections are used for inter-thread communication. If I don't use Q_ENUM or Q_REGISTER_METATYPE (and thus also don't call qRegisterMetatype(),) the connections won't work and you get this at runtime:

  QObject::connect: Cannot queue arguments of type 'MyClass::MyEnum'


Loading it into a QVariant automatically registers, as QVariant calls
qMetaTypeId<Enum>() to get the metatype ID.

Not sure what you mean here. I'm not using a QVariant anywhere, at least not explicitly.
_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest

Reply via email to