我创建了一个QObject看起来像这样的派生类:
namespace MyNamespace
{
class MyClass : public QObject
{
Q_OBJECT
public:
enum MyEnum
{
Item1,
Item2
};
Q_SIGNALS:
void mySignal(MyEnum type);
};
}
MyEnum需要注册qRegisterMetaType。
这是一个转折点:这个类包含在一个共享库中,因此我想避免指示任何使用我的库的人调用qRegisterMetaType. 相反,enum应该在加载共享库后立即注册。
有没有办法做到这一点?我需要使用 Qt 5 的解决方案(我目前不支持 Qt 4.x)。Qt 5.1 引入了QGlobalStatic该类,但我需要保持与 Qt 5.0 的兼容性。
如果我要使用Q_DECLARE_METATYPE,它将需要超出名称空间。它看起来像这样:
Q_DECLARE_METATYPE(MyNamespace::MyClass::MyEnum)
但是,Q_DECLARE_METATYPE宏将扩展为以下对 的调用qRegisterMetaType:
qRegisterMetaType< MyNamespace::MyClass::MyEnum >("MyNamespace::MyClass::MyEnum",
reinterpret_cast< MyNamespace::MyClass::MyEnum *>(quintptr(-1)));
因此enum将使用完整的命名空间限定符进行注册,但信号将注册为mySignal(MyEnum). 因此,该类型MyEnum不会在 Qt 中注册,因为只MyNamespace::MyClass::MyEnum注册了。