Как смоделировать перечисление C ++ для Qt Quick Designer? - PullRequest
1 голос
/ 06 марта 2019

У меня есть перечисление 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

При открытии этого файла QML в Qt Quick Designer (вкладка «Дизайн» в Qt Creator) он отказывается загружать файл и говорит QML module not found (SectionIdImportName), так как Designer не запускает никакого кода C ++.

Как я могу заставить Designer работать с этим файлом QML, использующим перечисление C ++?

Мне известны атрибуты перечисления QML_DESIGNER_IMPORT_PATH и QML .Я попытался «смоделировать» перечисление C ++ таким перечислением QML только для Designer, однако эти значения перечисления используются следующим образом QMLType.EnumType.EnumValue, в то время как значения перечисления C ++ должны указываться только с помощью EnumType.EnumValue.Кажется, что код может быть совместим с перечислением C ++ или QML, но не обоими одновременно.

Я использую Qt 5.11, скоро обновлюсь до 5.12.

1 Ответ

1 голос
/ 06 марта 2019

У меня он работает как во время выполнения, так и в дизайнере с перечислением, инкапсулированным в класс:

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
}

Обратите внимание, что имя перечисления не используется.

Вы можете добавить больше перечислений в тот же класс, но тогда имена могут конфликтовать (по домену или по тексту).)

...