如何为Qt快速设计器模拟C ++枚举?

时间:2019-03-06 12:35:18

标签: c++ qt qml qt-creator qt-designer

我有一个这样定义的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 Creator中的“设计”选项卡)上打开该QML文件时,由于设计器未运行任何C ++代码,它拒绝加载该文件并显示QML module not found (SectionIdImportName)。 / p>

如何使Designer与使用C ++枚举的QML文件一起使用?

我知道QML_DESIGNER_IMPORT_PATHQML enumeration attributes。我试图通过QML枚举来“模拟” C ++枚举,仅用于设计器,但是,这些枚举的值的使用像这样QMLType.EnumType.EnumValue,而C ++枚举值必须仅用EnumType.EnumValue来处理。该代码似乎可以与C ++枚举或QML枚举兼容,但不能同时兼容。

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

1 个答案:

答案 0 :(得分:1)

我将其枚举封装在类中,从而在运行时和设计器中都可以使用:

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
}

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

您可以在同一类中添加更多枚举,但是名称可能会冲突(无论是按域还是按文本)