我创建了一个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
注册了。