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