如何为QT快速设计师模拟C 枚举



我有这样定义的C 枚举:

namespace SectionIdNamespace
{
    Q_NAMESPACE
    enum SectionId {
        SomeValue
    };
    Q_ENUM_NS(SectionId)
};

我注册该枚举如下:

qmlRegisterUncreatableMetaObject(
    SectionIdNamespace::staticMetaObject,
    "SectionIdImportName",
    1, 0,
    "SectionId",
    "Error: only enums"
);

并在QML中使用它:

import SectionIdImportName 1.0
....
SectionId.SomeValue

在QT快速设计器(QT创建者中的"设计"选项卡)中打开该QML文件时,它拒绝加载文件并说QML module not found (SectionIdImportName),因为设计师不运行任何C 代码。

如何使设计人员使用使用C 枚举的QML文件?

我知道QML_DESIGNER_IMPORT_PATH和QML枚举属性。我试图通过为设计师枚举这样的QML枚举"模拟" C 枚举,但是,这些枚举的值与此QMLType.EnumType.EnumValue一样使用,而C 枚举值只需用EnumType.EnumValue就可以使人闻名。似乎代码可以与C 枚举或QML枚举兼容,但并非同时兼容。

我正在使用QT 5.11,很快升级到5.12。

我在运行时和设计师都可以使用它的枚举:

class SectionIdWrapper : public QObject
{
    Q_OBJECT
  public:
    enum class SectionIdEnum {
        SomeValue
    };
    Q_ENUM(SectionIdEnum);
};

和注册如下:

qmlRegisterUncreatableType<SectionIdWrapper>("your.namespace", 1, 0, "SectionId", "Error: only enum");

和QML中的使用情况,就像预期:

import your.namespace 1.0
Item {
    property int test: SectionId.SomeValue
}

请注意,未使用枚举的名称。

您可以在同一类中添加更多的枚举,但是这些名称可能会碰撞(域名或文本方面)

最新更新