如何确保加载我的共享库时运行qRegisterMetaType?

时间:2013-07-03 17:13:31

标签: c++ initialization shared-libraries qt5

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

0 个答案:

没有答案