Как создать макет перечисления C для Qt Quick Designer?

#c #qt #qml #qt-creator #qt-designer

#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
  

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

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

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

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

Ответ №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
}
  

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

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

Комментарии:

1. Насколько я могу видеть, это похоже на то, что у меня уже есть. Я могу получить доступ к перечислению C из QML так же, как и вы. Но для меня конструктор завершается ошибкой при выполнении инструкции import. В вашем случае, как дизайнер узнает, что ваше.namespace существует? Он никогда не запускает код C с вызовом qmlRegisterUncreatableType.

2. У меня были проблемы с QT_ENUM_NS , и это сработало для меня, вот почему я ответил. Что касается дизайнера, я иногда вижу, что ему не удается перехватить новые вызовы qmlRegister, но после сборки они работают (если они верны). Я думаю, что у Qt Creator есть какой-то внутренний анализатор, который просматривает все файлы проекта, находя вызовы qmlRegister, или, возможно, MOC создает кэш.

3. Действительно, это ошибка в qt creator: bugreports.qt.io/browse/QTCREATORBUG-20569 . qmlRegisterUncreatableType работает, qmlRegisterUncreatableMetaObject нет. Большое спасибо, что указали мне правильное направление!