#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
нет. Большое спасибо, что указали мне правильное направление!