4

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

4

0 回答 0