为什么q_enum在没有qregistermetatepe的情况下无法获得正确的类型值

why q_enum unable to get correct type value without qRegisterMetaType?

本文关键字:类型 情况下 enum 为什么 qregistermetatepe      更新时间:2023-10-16

我有一个带有多个DLL的QT项目。

dlls:a,b,c

A取决于B和C。而B和C没有任何依赖性。

b导出自定义类B_custom。B_custom类是从qobject派生的。

dll a:

Class Exported A : public C
{
    ...
    Q_PROPERTY(B_Custom:B_Enum b_enum READ GetBEnum WRITE SetBEnum NOTIFY BEnumChanged);
    void DoSomething()
    {
        SomethingElse("b_enum");
    }
    ....
}

dll b:

class Exported B_Custom: public QObject
{
    Q_OBJECT;
    public:
        enum B_Enum {
            ...
        };
        Q_ENUM(B_Enum);
    ...
}

dll c:

Class C : public QObject
{
    virtual void SomethingElse(const QByteArray &propName)
    {
        auto type = property(propName).userType();
    }
}    

主要:

A * a = new A();
a->DoSomething();

问题是针对C类,函数的类型值something sometherse是qmetatype :: unknowntype。

但是,如果我在

中手动注册b_enum
qRegisterMetaType<B_Custom::B_Enum>() 

在致电a :: dosomething((之前,函数的类型值某物不会是qmetatype :: unknowntype。

它将返回正确的类型值,例如1230,用于输入函数c。

的函数某物

但要累积到qt文档@http://doc.qt.io/qt-5/qobject.html#q_enum,

用q_enum声明的枚举将其qmetaenum注册在封闭的qmetaObject中。您也可以使用qmetaenum :: fromType((获取qmetaenum。

注册的枚举也会自动注册到QT Meta类型系统,使其成为Qmetatype已知的,而无需使用q_declare_metatype((。

那么,为什么我需要调用qregistermetatype((才能让键入C类的theSingse函数获取正确的类型值?

dll b中有很多类似类型,需要在c。

中获取类型信息

如果我需要使用qregistermetatype一一注册这些类型,那确实不是一个乐趣。

仔细查看以下文档:

"此外,必须在使用Qobject :: property((api,qregisterMetatype((之前使用T型T型,必须在使用之前,通常在使用T的类构造函数中(函数。"

http://doc.qt.io/qt-5/qmetatype.html#qregistermetatype-1。

现在回到您的代码:

您在B_Custom类中声明了Q_ENUM(B_Enum);

但是该 enum的属性在class A中声明。

现在再次回顾上面指定的文档语句。

因此,要将enumclass A中声明的CC_5一起使用,您是否必须在使用class A构造函数中或在使用它之前在MAIM函数中注册META类型(您使用过并使用(。

更多您可能会疑问,为什么我们需要在另一个类别中再次注册。

查看以下语句:似乎您必须在所有类型中,无论您使用的地方,不仅在您声明的类中注册类型。

"如果在另一个类中声明了枚举类型,则需要其完全合格的名称(即其他class ::优先级(,并且其他类也必须继承Qobject并使用此处注册枚举类型q_enum((宏。" (http://doc.qt.io/qt-5/properties.html(

相关文章: