Spec-Zone.ru › Qt 5.15

Класс QQmlEngine

Класс QQmlEngine предоставляет среду для создания экземпляров компонентов QML. Подробнее...

Заголовок: #include <QQmlEngine>
qmake: QT += qml
С тех пор: Qt 5.0
Наследует: QJSEngine
Наследуется от:

QQmlApplicationEngine

Этот класс был представлен в Qt 5.0.

  • Список всех членов, включая унаследованные
  • Устаревшие члены

Типы

Перечисление ObjectOwnership { CppOwnership, JavaScriptOwnership }

Свойства

  • offlineStoragePath : QString

Открытые функции

QQmlEngine(QObject *parent = nullptr)
virtual ~QQmlEngine() override
void addImageProvider(const QString &providerId, QQmlImageProviderBase *provider)
void addImportPath(const QString &path)
void addPluginPath(const QString &path)
QUrl baseUrl() const
void clearComponentCache()
QQmlImageProviderBase * imageProvider(const QString &providerId) const
QStringList importPathList() const
bool importPlugin(const QString &filePath, const QString &uri, QList<QQmlError> *errors)
QQmlIncubationController * incubationController() const
QNetworkAccessManager * networkAccessManager() const
QQmlNetworkAccessManagerFactory * networkAccessManagerFactory() const
QString offlineStorageDatabaseFilePath(const QString &databaseName) const
QString offlineStoragePath() const
bool outputWarningsToStandardError() const
QStringList pluginPathList() const
void removeImageProvider(const QString &providerId)
QQmlContext * rootContext() const
void setBaseUrl(const QUrl &url)
void setImportPathList(const QStringList &paths)
void setIncubationController(QQmlIncubationController *controller)
void setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory)
void setOfflineStoragePath(const QString &dir)
void setOutputWarningsToStandardError(bool enabled)
void setPluginPathList(const QStringList &paths)
T singletonInstance(int qmlTypeId)
void trimComponentCache()

Публичные слоты

void retranslate()

Сигналы

void exit(int retCode)
void quit()
void warnings(const QList<QQmlError> &warnings)

Статические публичные члены

QQmlContext * contextForObject(const QObject *object)
QQmlEngine::ObjectOwnership objectOwnership(QObject *object)
void setContextForObject(QObject *object, QQmlContext *context)
void setObjectOwnership(QObject *object, QQmlEngine::ObjectOwnership ownership)

Переопределённые защищённые функции

virtual bool event(QEvent *e) override

Связанные нечлены

QObject * qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
void qmlClearTypeRegistrations()
QQmlContext * qmlContext(const QObject *object)
QQmlEngine * qmlEngine(const QObject *object)
bool qmlProtectModule(const char *uri, int majVersion)
int qmlRegisterAnonymousType(const char *uri, int versionMajor)
int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
int qmlRegisterInterface(const char *typeName)
void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)
int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
int qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject)
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QJSValue (*)(QQmlEngine *, QJSEngine *) callback)
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*)(QQmlEngine *, QJSEngine *) callback)
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback)
int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
int qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Макросы

QML_ADDED_IN_MINOR_VERSION(VERSION)
QML_ANONYMOUS
QML_ATTACHED(ATTACHED_TYPE)
QML_DECLARE_TYPE
QML_DECLARE_TYPEINFO(Type, Flags)
QML_ELEMENT
QML_EXTENDED(EXTENDED_TYPE)
QML_FOREIGN(FOREIGN_TYPE)
QML_INTERFACE
QML_NAMED_ELEMENT(name)
QML_REMOVED_IN_MINOR_VERSION(VERSION)
QML_SINGLETON
QML_UNAVAILABLE
QML_UNCREATABLE(reason)

Подробное описание

Каждый QML компонент создаётся в QQmlContext. QQmlContext необходимы для передачи данных QML компонентам. В QML контексты организованы иерархически, и эта иерархия управляется QQmlEngine.

Перед созданием QML компонентов, приложение должно создать QQmlEngine для доступа к QML контексту. Следующий пример показывает, как создать простой элемент Text.

QQmlEngine engine;
QQmlComponent component(&engine);
component.setData("import QtQuick 2.0\nText { text: \"Hello world!\" }", QUrl());
QQuickItem *item = qobject_cast<QQuickItem *>(component.create());

//add item to view, etc
...

В этом случае, элемент Text будет создан в корневом контексте движка.

См. также QQmlComponent, QQmlContext, и QML Глобальный Объект.

Документация типов членов

Перечисление QQmlEngine::ObjectOwnership

ObjectOwnership управляет тем, уничтожает ли QML автоматически QObject при сборке мусора JavaScript объекта движком. Два варианта владения:

Константа Значение Описание
QQmlEngine::CppOwnership 0 Объект принадлежит коду C++ и QML никогда не удалит его. Метод destroy() JavaScript не может использоваться для этих объектов. Этот вариант подобен QScriptEngine::QtOwnership.
QQmlEngine::JavaScriptOwnership 1 Объект принадлежит JavaScript. Когда объект возвращается QML в качестве результата вызова метода, QML отслеживает его и удаляет, если нет оставшихся JavaScript ссылок на него и у него нет QObject::parent(). Объект, отслеживаемый одним QQmlEngine, будет удалён во время уничтожения этого QQmlEngine. Таким образом, JavaScript ссылки между объектами с JavaScriptOwnership от двух разных движков не будут действительны, если один из этих движков будет удалён. Этот вариант подобен QScriptEngine::ScriptOwnership.

Обычно приложение не нуждается в явном указании владения объектом. QML использует эвристику для установки значения владения по умолчанию. По умолчанию, объект, созданный QML, имеет JavaScriptOwnership. Исключение составляют корневые объекты, созданные с помощью вызова QQmlComponent::create() или QQmlComponent::beginCreate(), которые по умолчанию имеют CppOwnership. Владение этими объектами корневого уровня считается переданным вызывающему C++ коду.

Объекты, не созданные QML, по умолчанию имеют CppOwnership. Исключение составляют объекты, возвращаемые вызовами C++ методов; их владение будет установлено в JavaScriptOwnership. Это относится только к явным вызовам методов или слотов Q_INVOKABLE, но не к вызовам свойств-геттеров.

Вызов setObjectOwnership() переопределяет эвристику владения по умолчанию, используемую QML.

Документация по свойствам

offlineStoragePath : QString

Это свойство содержит каталог для хранения автономных данных пользователя

Возвращает каталог, в котором хранятся SQL и другие автономные данные.

SQL базы данных, созданные с помощью openDatabase(), хранятся здесь.

По умолчанию - QML/OfflineStorage в каталоге данных приложения пользователя, стандартном для платформы.

Обратите внимание, что путь может в данный момент отсутствовать в файловой системе, поэтому вызывающие стороны, желающие создать новые файлы в этом расположении, должны сначала создать его - см. QDir::mkpath().

Функции доступа:

QString offlineStoragePath() const
void setOfflineStoragePath(const QString &dir)

Документация по членам-функциям

QQmlEngine::QQmlEngine(QObject *parent = nullptr)

Создает новый QQmlEngine с заданным parent.

[signal] void QQmlEngine::exit(int retCode)

Этот сигнал испускается, когда QML, загруженный движком, хочет выйти из цикла событий со специфицированным кодом возврата retCode.

Эта функция была введена в Qt 5.8.

См. также quit().

[signal] void QQmlEngine::quit()

Этот сигнал испускается, когда QML, загруженный движком, хочет выйти.

См. также exit().

[slot] void QQmlEngine::retranslate()

Обновляет все выражения привязки, использующие строки, помеченные для перевода.

Вызовите эту функцию после установки нового переводчика с помощью QCoreApplication::installTranslator, чтобы убедиться, что ваш пользовательский интерфейс отображает актуальные переводы.

Примечание: Из-за ограничения в реализации эта функция обновляет все привязки движка, а не только те, которые используют строки, помеченные для перевода. Это может быть оптимизировано в будущих версиях.

Эта функция была введена в Qt 5.10.

[signal] void QQmlEngine::warnings(const QList<QQmlError> &warnings)

Этот сигнал испускается, когда warnings сообщения генерируются QML.

[override virtual] QQmlEngine::~QQmlEngine()

Уничтожает QQmlEngine.

Любые QQmlContext'ы, созданные на этом движке, будут недействительными, но не уничтоженными (если они не являются дочерними для объекта QQmlEngine).

См. документацию QJSEngine для получения подробностей по очистке движка JS.

void QQmlEngine::addImageProvider(const QString &providerId, QQmlImageProviderBase *provider)

Устанавливает provider для использования при запросах изображений через схему url: image, с хостом providerId. QQmlEngine принимает владение provider.

Поставщики изображений обеспечивают поддержку запросов растровых изображений и запросов изображений в потоке. См. документацию QQuickImageProvider для получения подробностей о реализации и использовании поставщиков изображений.

Все необходимые поставщики изображений должны быть добавлены в движок до загрузки любого файла QML.

См. также removeImageProvider(), QQuickImageProvider и QQmlImageProviderBase.

void QQmlEngine::addImportPath(const QString &path)

Добавляет path в качестве каталога, где движок ищет установленные модули в структуре каталогов на основе URL.

path может быть каталогом локальной файловой системы, путем к ресурсу Qt (:/imports), URL ресурса Qt (qrc:/imports) или URL.

path будет преобразован в каноническую форму перед добавлением в список путей импорта.

Новый добавленный path будет первым в importPathList().

См. также setImportPathList() и Модули QML.

void QQmlEngine::addPluginPath(const QString &path)

Добавляет path в качестве каталога, где движок ищет нативные плагины для импортированных модулей (ссылка на файл в qmldir).

По умолчанию, список содержит только ., т.е. движок ищет в каталоге самого файла qmldir.

Новый добавленный path будет первым в pluginPathList().

См. также setPluginPathList().

QUrl QQmlEngine::baseUrl() const

Возвращает базовый URL для этого движка. Базовый URL используется только для разрешения компонентов, когда в конструктор QQmlComponent передается относительный URL.

Если базовый URL не был явно задан, этот метод возвращает текущую рабочую директорию приложения.

См. также setBaseUrl().

void QQmlEngine::clearComponentCache()

Очищает внутренний кэш компонентов движка.

Эта функция приводит к уничтожению метаданных свойств всех компонентов, ранее загруженных движком. Все ранее загруженные компоненты и привязки свойств для всех существующих объектов, созданных из этих компонентов, перестанут функционировать.

Эта функция возвращает движок в состояние, где он не содержит данных загруженных компонентов. Это может быть полезно для загрузки более ограниченного подмножества предыдущего набора компонентов или для загрузки новой версии ранее загруженного компонента.

После очистки кэша компонентов компоненты необходимо загрузить, прежде чем можно будет создавать новые объекты.

См. также trimComponentCache().

[static] QQmlContext *QQmlEngine::contextForObject(const QObject *object)

Возвращает QQmlContext для объекта object, или 0, если контекст не был установлен.

При создании QObject движком QQmlEngine, контекст устанавливается автоматически.

См. также setContextForObject(), qmlContext() и qmlEngine().

[override virtual protected] bool QQmlEngine::event(QEvent *e)

Переопределяет: QObject::event(QEvent *e).

QQmlImageProviderBase *QQmlEngine::imageProvider(const QString &providerId) const

Возвращает поставщика изображений, установленного для providerId, если найден; в противном случае возвращает nullptr.

См. также QQuickImageProvider.

QStringList QQmlEngine::importPathList() const

Возвращает список каталогов, в которых движок ищет установленные модули в структуре каталогов на основе URL.

Например, если /opt/MyApp/lib/imports находится в пути, то QML, импортирующий com.mycompany.Feature, заставит QQmlEngine искать компоненты, предоставляемые этим модулем, в /opt/MyApp/lib/imports/com/mycompany/Feature/. Требуется файл qmldir для определения сопоставления версий типов и, возможно, плагинов расширений QML.

По умолчанию, список содержит каталог исполняемого файла приложения, пути, указанные в переменной среды QML2_IMPORT_PATH, и встроенный Qml2ImportsPath из QLibraryInfo.

См. также addImportPath() и setImportPathList().

bool QQmlEngine::importPlugin(const QString &filePath, const QString &uri, QList<QQmlError> *errors)

Импортирует плагин, имя которого filePath, с предоставленным uri. Возвращает true, если плагин был успешно импортирован; в противном случае возвращает false.

В случае неудачи и если errors не нулевой, список errors будет содержать любые произошедшие ошибки, добавленные в начало.

Плагин должен быть Qt-плагином, реализующим интерфейс QQmlEngineExtensionPlugin.

QQmlIncubationController *QQmlEngine::incubationController() const

Возвращает текущий контроллер инкубации или 0, если контроллер не был задан.

См. также setIncubationController().

QNetworkAccessManager *QQmlEngine::networkAccessManager() const

Возвращает общий QNetworkAccessManager, который может использоваться любым типом QML, созданным этим движком.

Если был установлен QQmlNetworkAccessManagerFactory, а QNetworkAccessManager ещё не был создан, будет использован QQmlNetworkAccessManagerFactory для создания QNetworkAccessManager; в противном случае возвращаемый QNetworkAccessManager не будет иметь прокси или кэш.

См. также setNetworkAccessManagerFactory().

QQmlNetworkAccessManagerFactory *QQmlEngine::networkAccessManagerFactory() const

Возвращает текущий QQmlNetworkAccessManagerFactory.

См. также setNetworkAccessManagerFactory().

[static] QQmlEngine::ObjectOwnership QQmlEngine::objectOwnership(QObject *object)

Возвращает владение объектом object.

См. также setObjectOwnership().

QString QQmlEngine::offlineStorageDatabaseFilePath(const QString &databaseName) const

Возвращает путь к файлу, где база данных хранилища Local Storage с идентификатором databaseName расположена (или будет расположена).

Эта функция была добавлена в Qt 5.9.

См. также LocalStorage.openDatabaseSync().

bool QQmlEngine::outputWarningsToStandardError() const

Возвращает true, если сообщения об ошибках будут выводиться в stderr помимо излучения сигнала warnings(), в противном случае false.

Значение по умолчанию — true.

См. также setOutputWarningsToStandardError().

QStringList QQmlEngine::pluginPathList() const

Возвращает список директорий, в которых движок ищет родные плагины для импортированных модулей (ссылка в файле qmldir).

По умолчанию, список содержит только ., т.е. движок ищет в директории самого файла qmldir.

См. также addPluginPath() и setPluginPathList().

void QQmlEngine::removeImageProvider(const QString &providerId)

Удаляет поставщик изображений для providerId.

См. также addImageProvider() и QQuickImageProvider.

QQmlContext *QQmlEngine::rootContext() const

Возвращает корневой контекст движка.

Корневой контекст автоматически создаётся движком QQmlEngine. Данные, которые должны быть доступны всем экземплярам компонентов QML, созданным движком, должны быть размещены в корневом контексте.

Дополнительные данные, которые должны быть доступны только подмножеству экземпляров компонентов, должны быть добавлены в подконтексты, родительские по отношению к корневому контексту.

void QQmlEngine::setBaseUrl(const QUrl &url)

Устанавливает базовый URL для этого движка в url.

См. также baseUrl().

[static] void QQmlEngine::setContextForObject(QObject *object, QQmlContext *context)

Устанавливает QQmlContext для объекта object в context. Если у object уже есть контекст, выводится предупреждение, но контекст не меняется.

Когда QQmlEngine создаёт QObject, контекст устанавливается автоматически.

См. также contextForObject().

void QQmlEngine::setImportPathList(const QStringList &paths)

Устанавливает paths в качестве списка директорий, где движок ищет установленные модули в структуре URL-директорий.

По умолчанию список содержит директорию исполняемого файла приложения, пути, указанные в переменной окружения QML2_IMPORT_PATH, и встроенную Qml2ImportsPath из QLibraryInfo.

См. также importPathList() и addImportPath().

void QQmlEngine::setIncubationController(QQmlIncubationController *controller)

Устанавливает контроллер инкубации controller движка. Движок может иметь только один активный контроллер и не принимает на себя владения им.

См. также incubationController().

void QQmlEngine::setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory)

Устанавливает factory для создания QNetworkAccessManager(ов).

QNetworkAccessManager используется для всех сетевых операций QML. Реализовав фабрику, можно создать настраиваемый QNetworkAccessManager со специальной кэшированием, прокси и поддержкой файлов cookie.

Фабрика должна быть установлена до запуска движка.

Примечание: QQmlEngine не принимает на себя владение фабрикой.

См. также networkAccessManagerFactory().

[static] void QQmlEngine::setObjectOwnership(QObject *object, QQmlEngine::ObjectOwnership ownership)

Устанавливает ownership владения объектом object.

См. также objectOwnership().

void QQmlEngine::setOutputWarningsToStandardError(bool enabled)

Устанавливает, будут ли сообщения об ошибках выводиться в stderr в enabled.

Если enabled равно true, все сообщения об ошибках, сгенерированные QML, будут выводиться в stderr и излучаться сигналом warnings(). Если enabled равно false, будет излучаться только сигнал warnings(). Это позволяет приложениям самостоятельно обрабатывать вывод сообщений об ошибках.

Значение по умолчанию — true.

См. также outputWarningsToStandardError().

void QQmlEngine::setPluginPathList(const QStringList &paths)

Устанавливает список директорий, в которых движок ищет родные плагины для импортированных модулей (ссылка в файле qmldir), в paths.

По умолчанию, список содержит только ., т.е. движок ищет в директории самого файла qmldir.

См. также pluginPathList() и addPluginPath().

template <typename T> T QQmlEngine::singletonInstance(int qmlTypeId)

Возвращает экземпляр типа синглтона, зарегистрированного под qmlTypeId.

Шаблонный аргумент T может быть либо QJSValue, либо указатель на тип, производный от QObject, и зависит от того, как синглтон был зарегистрирован. Если экземпляр T ещё не создан, он создаётся сейчас. Если qmlTypeId не представляет допустимый тип синглтона, возвращается либо QJSValue по умолчанию, либо nullptr.

Пример с QObject*:

class MySingleton : public QObject {
  Q_OBJECT

  // Register as default constructed singleton.
  QML_ELEMENT
  QML_SINGLETON

  static int typeId;
  // ...
};

MySingleton::typeId = qmlTypeId(...);

// Retrieve as QObject*
QQmlEngine engine;
MySingleton* instance = engine.singletonInstance<MySingleton*>(MySingleton::typeId);

Пример с QJSValue:

// Register with QJSValue callback
int typeId = qmlRegisterSingletonType(...);

// Retrieve as QJSValue
QQmlEngine engine;
QJSValue instance = engine.singletonInstance<QJSValue>(typeId);

Рекомендуется хранить идентификатор типа QML, например, как статический член в классе синглтона. Поиск через qmlTypeId() является затратным.

Эта функция была добавлена в Qt 5.12.

См. также QML_SINGLETON, qmlRegisterSingletonType(), и qmlTypeId().

void QQmlEngine::trimComponentCache()

Очищает внутренний кэш компонентов движка.

Эта функция приводит к уничтожению метаданных свойств загруженных компонентов, которые в данный момент не используются.

Компонент считается используемым, если существуют какие-либо существующие экземпляры самого компонента, любые экземпляры других компонентов, использующих компонент, или любые объекты, созданные любыми из этих компонентов.

См. также clearComponentCache().

END_OF_DOCUMENT_MARKER

Связанные не члены

template <typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)

Форма этой шаблонной функции:

template<typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)

Это возвращает экземпляр присоединенного объекта, который был присоединен к указанному attachee типом присоединения T.

Если create имеет значение true, а тип T является допустимым типом присоединения, это создает и возвращает новый экземпляр присоединенного объекта.

Возвращает 0, если тип T не является допустимым типом присоединения или если create имеет значение false, и ранее не был создан экземпляр присоединенного объекта для attachee.

См. также QML_ATTACHED() и Предоставление присоединенных свойств.

void qmlClearTypeRegistrations()

Очищает все сохраненные регистрации типов, такие как те, что созданы с помощью qmlRegisterType().

Не вызывайте эту функцию, когда существует QQmlEngine, иначе поведение будет неопределенным. Все существующие QQmlEngines должны быть удалены перед вызовом этой функции. Эта функция затрагивает только глобальный кеш приложения. Удалите QQmlEngine для очистки всех кэшированных данных, относящихся к этому движку.

QQmlContext *qmlContext(const QObject *object)

Возвращает QQmlContext, связанный с object, если таковой имеется. Это эквивалентно QQmlEngine::contextForObject(object).

Примечание: Добавьте #include <QtQml> для использования этой функции.

См. также contextForObject() и qmlEngine().

QQmlEngine *qmlEngine(const QObject *object)

Возвращает QQmlEngine, связанный с object, если таковой имеется. Это эквивалентно QQmlEngine::contextForObject(object)->engine(), но более эффективно.

Примечание: Добавьте #include <QtQml> для использования этой функции.

См. также contextForObject() и qmlContext().

bool qmlProtectModule(const char *uri, int majVersion)

Эта функция защищает модуль от регистрации типов в нем. Это может использоваться для предотвращения вставки типов другими плагинами в ваш модуль. Это также может улучшить производительность, поскольку позволяет движку пропустить проверку на возможность новых типов или плагинов при достижении этого импорта.

Преимущество в производительности проявляется главным образом при регистрации типов, специфичных для приложения, внутри приложения, а не через плагин. Использование qmlProtectModule позволяет движку пропустить проверку плагина при импорте этого uri, что может быть заметно при медленных файловых системах.

После вызова этой функции любая попытка зарегистрировать типы C++ в этой комбинации uri и версии приведет к ошибке во время выполнения. Вызовите эту функцию после регистрации всех ваших типов в движке.

Возвращает true, если был найден и заблокирован модуль с uri в качестве идентификатора модуля и majVersion в качестве номера основной версии; в противном случае возвращает false. Модуль должен содержать экспортируемые типы, чтобы быть найденным.

template <typename T> int qmlRegisterAnonymousType(const char *uri, int versionMajor)

Эта шаблонная функция регистрирует тип C++ в системе QML как анонимный тип. Результирующий тип QML не имеет имени. Поэтому экземпляры этого типа не могут быть созданы из системы QML. Однако вы можете получить доступ к экземплярам типа, когда они экспонированы как свойства других типов.

Используйте эту функцию, когда тип не будет ссылаться по имени, особенно для типов C++, используемых в левой части привязки свойств. Для указания модуля, к которому принадлежит тип, используйте uri и versionMajor.

Например, рассмотрим следующие два класса:

class Bar : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged)

public:
    Bar() {}

    QString baz() const { return mBaz; }

    void setBaz(const QString &baz)
    {
        if (baz == mBaz)
            return;

        mBaz = baz;
        emit bazChanged();
    }

signals:
    void bazChanged();

private:
    QString mBaz;
};

class Foo : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Bar *bar READ bar CONSTANT FINAL)

public:
    Foo() {}

    Bar *bar() { return &mBar; }

private:
    Bar mBar;
};

В QML мы присваиваем строку свойству baz объекта bar:

Foo {
    bar.baz: "abc"
    Component.onCompleted: print(bar.baz)
}

Чтобы движок QML знал, что тип Bar имеет свойство baz, мы должны сделать тип Bar известным:

qmlRegisterType<Foo>("App", 1, 0, "Foo");
qmlRegisterAnonymousType<Bar>("App", 1);

Поскольку тип Foo инициализируется в QML, его необходимо зарегистрировать с помощью версии qmlRegisterType(), которая принимает имя элемента.

Возвращает идентификатор типа QML.

Эта функция была введена в Qt 5.14.

См. также QML_ANONYMOUS и Выбор правильного метода интеграции между C++ и QML.

template <typename T, typename E> int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Эта шаблонная функция регистрирует тип C++ и его расширение в системе QML с именем qmlName в библиотеке, импортированной из uri, имеющей номер версии, составленный из versionMajor и versionMinor. Свойства, отсутствующие в основном типе, будут искаться в объекте расширения.

Возвращает идентификатор типа QML.

См. также QML_EXTENDED(), qmlRegisterType() и Регистрация объектов расширения.

template <typename T, typename E> int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)

Эта шаблонная функция регистрирует тип C++ и его расширение в системе QML с именем qmlName в библиотеке, импортированной из uri, имеющей номер версии, составленный из versionMajor и versionMinor.

Хотя у типа есть имя и тип, его нельзя создать. Если пользователь попытается создать экземпляр этого типа, будет выведено сообщение об ошибке с заданным reason.

Это полезно в случаях, когда тип предназначен только для предоставления присоединенных свойств, значений перечислений или абстрактного базового класса с его расширением.

Возвращает идентификатор типа QML.

См. также QML_EXTENDED(), QML_UNCREATABLE() и qmlRegisterUncreatableType().

template <typename T> int qmlRegisterInterface(const char *typeName)

Эта шаблонная функция регистрирует тип C++ в системе QML под именем typeName.

Типы, зарегистрированные как интерфейсы в движке, также должны объявлять себя как интерфейсы с системой метаобъектов. Например:

struct FooInterface
{
public:
    virtual ~FooInterface();
    virtual void doSomething() = 0;
};

Q_DECLARE_INTERFACE(FooInterface, "org.foo.FooInterface")

При регистрации в движке QML таким образом, они могут использоваться как типы свойств:

Q_PROPERTY(FooInterface *foo READ foo WRITE setFoo)

При присвоении подклассу QObject этому свойству, движок QML автоматически выполняет приведение интерфейса к типу FooInterface*.

Возвращает идентификатор типа QML.

См. также QML_INTERFACE.

void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)

Эта функция регистрирует модуль в определенном uri с указанной версией в versionMajor и versionMinor.

Это может использоваться для предоставления определенной версии модуля, даже если для этой версии не зарегистрированы типы. Это особенно полезно для синхронизации версий связанных модулей.

Эта функция была введена в Qt 5.9.

template <typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)

Эта шаблонная функция регистрирует указанную версию типа C++ в системе QML с библиотекой, импортированной из uri, имеющей номер версии, составленный из versionMajor и versionMinor.

Возвращает идентификатор типа QML.

template<typename T, int metaObjectRevision>
int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor);

Эта функция обычно используется для регистрации ревизии базового класса для использования с указанной версией типа (см. Ревизии и версии типов).

int qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject)

Эта функция используется для регистрации одиночного объекта cppObject с определенным uri и typeName. Его версия является комбинацией versionMajor и versionMinor.

Установка типа одиночки в URI позволяет предоставить произвольную функциональность (методы и свойства) коду QML без необходимости создания отдельных экземпляров типа клиентом.

Используйте эту функцию для регистрации объекта заданного типа T как типа одиночки.

Синглтон-тип QObject может быть указан по имени типа, с помощью которого он был зарегистрирован; в свою очередь, это имя типа может быть использовано в качестве целевого типа в подключении или как любой другой идентификатор типа. Однако есть одно исключение: свойство синглтон-типа QObject не может быть переименовано, так как имя синглтон-типа не идентифицирует объект в рамках того же компонента, что и любой другой элемент.

Примечание: cppObject должен существовать дольше, чем движок QML, в котором он используется. Кроме того, cppObject должен иметь ту же аффинити-связь с потоком, что и движок. Если вам нужны отдельные синглтон-экземпляры для нескольких движков, необходимо использовать qmlRegisterSingletonType. Для получения дополнительной информации о потоковой безопасности см. Потоки и QObjects.

Использование:

// First, define your QObject which provides the functionality.
class SingletonTypeExample : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged)

public:
    explicit SingletonTypeExample(QObject* parent = nullptr) : QObject(parent) {}

    Q_INVOKABLE int doSomething()
    {
        setSomeProperty(5);
        return m_someProperty;
    }

    int someProperty() const { return m_someProperty; }
    void setSomeProperty(int val) {
        if (m_someProperty != val) {
            m_someProperty = val;
            emit somePropertyChanged(val);
        }
    }

signals:
    void somePropertyChanged(int newValue);

private:
    int m_someProperty = 0;
};
// Second, create an instance of the object

// allocate example before the engine to ensure that it outlives it
QScopedPointer<SingletonTypeExample> example(new SingletonTypeExample);
QQmlEngine engine;

// Third, register the singleton type provider with QML by calling this
// function in an initialization function.
qmlRegisterSingletonInstance("Qt.example.qobjectSingleton", 1, 0, "MyApi", example.get());

Для использования зарегистрированного синглтон-типа в QML необходимо импортировать URI с соответствующей версией.

import QtQuick 2.0
import Qt.example.qobjectSingleton 1.0
Item {
    id: root
    property int someValue: MyApi.someProperty

    Component.onCompleted: {
        console.log(MyApi.doSomething())
    }
}

Данная функция была добавлена в Qt 5.14.

См. также QML_SINGLETON и qmlRegisterSingletonType.

int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QJSValue (*)(QQmlEngine *, QJSEngine *) callback)

Данная функция может быть использована для регистрации поставщика синглтон-типа callback в определённом uri и typeName с версией, указанной в versionMajor и versionMinor.

Установка синглтон-типа позволяет разработчикам предоставлять произвольные функции (методы и свойства) клиенту без необходимости создания отдельных экземпляров типа клиентом.

Синглтон-тип может быть либо QObject, либо QJSValue. Данная функция предназначена для регистрации функции поставщика синглтон-типа, которая возвращает QJSValue как синглтон-тип.

ПРИМЕЧАНИЕ: Свойства синглтон-типа QJSValue не будут вызывать повторную оценку привязки при изменении.

Использование:

// First, define the singleton type provider function (callback).
static QJSValue example_qjsvalue_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)

    static int seedValue = 5;
    QJSValue example = scriptEngine->newObject();
    example.setProperty("someProperty", seedValue++);
    return example;
}

// Second, register the singleton type provider with QML by calling this function in an initialization function.
qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", example_qjsvalue_singletontype_provider);

Альтернативно, можно использовать лямбда-выражение C++11:

qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QJSValue {
    Q_UNUSED(engine)

    static int seedValue = 5;
    QJSValue example = scriptEngine->newObject();
    example.setProperty("someProperty", seedValue++);
    return example;
});

Для использования зарегистрированного синглтон-типа в QML необходимо импортировать синглтон-тип.

import QtQuick 2.0
import Qt.example.qjsvalueApi 1.0 as ExampleApi
Item {
    id: root
    property int someValue: ExampleApi.MyApi.someProperty
}

См. также QML_SINGLETON и Выбор правильного метода интеграции между C++ и QML.

template <typename T> int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*)(QQmlEngine *, QJSEngine *) callback)

Данная функция может быть использована для регистрации поставщика синглтон-типа callback в определённом uri и typeName с версией, указанной в versionMajor и versionMinor.

Установка синглтон-типа в URI позволяет разработчикам предоставлять произвольные функции (методы и свойства) клиентам без необходимости создания отдельных экземпляров типа клиентом.

Синглтон-тип может быть либо QObject, либо QJSValue. Данная функция предназначена для регистрации функции поставщика синглтон-типа, которая возвращает QObject заданного типа T как синглтон-тип.

Синглтон-тип QObject может быть указан по имени типа, с помощью которого он был зарегистрирован, и это имя типа может быть использовано в качестве целевого типа в подключении или как любой другой идентификатор типа. Единственное исключение состоит в том, что свойство синглтон-типа QObject не может быть переименовано.

ПРИМЕЧАНИЕ: Экземпляр синглтон-типа QObject, возвращаемый поставщиком синглтон-типа, принадлежит движку QML, если объект не имеет явного флага QQmlEngine::CppOwnership.

Использование:

// First, define your QObject which provides the functionality.
class SingletonTypeExample : public QObject
{
    Q_OBJECT
    Q_PROPERTY (int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged)

public:
    SingletonTypeExample(QObject* parent = 0)
        : QObject(parent), m_someProperty(0)
    {
    }

    ~SingletonTypeExample() {}

    Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; }

    int someProperty() const { return m_someProperty; }
    void setSomeProperty(int val) { m_someProperty = val; emit somePropertyChanged(val); }

signals:
    void somePropertyChanged(int newValue);

private:
    int m_someProperty;
};

// Second, define the singleton type provider function (callback).
static QObject *example_qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    SingletonTypeExample *example = new SingletonTypeExample();
    return example;
}

// Third, register the singleton type provider with QML by calling this function in an initialization function.
qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", example_qobject_singletontype_provider);

Альтернативно, можно использовать лямбда-выражение C++11:

qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    SingletonTypeExample *example = new SingletonTypeExample();
    return example;
});

Для использования зарегистрированного синглтон-типа в QML необходимо импортировать синглтон-тип.

import QtQuick 2.0
import Qt.example.qobjectSingleton 1.0
Item {
    id: root
    property int someValue: MyApi.someProperty

    Component.onCompleted: {
        someValue = MyApi.doSomething()
    }
}

См. также QML_SINGLETON и Выбор правильного метода интеграции между C++ и QML.

template <typename T> int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback)

Данная функция перегружает qmlRegisterSingletonType.

Данная функция была добавлена в Qt 5.14.

int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Данная функция может быть использована для регистрации синглтон-типа с именем qmlName в библиотеке, импортируемой из uri с номером версии, состоящим из versionMajor и versionMinor. Тип определяется файлом QML, расположенным по адресу url. URI должен быть абсолютным, т.е. url.isRelative() == false.

Кроме того, файл QML типа должен иметь среди своих инструкций импорта псевдоним Singleton.

Синглтон-тип может быть указан по имени типа, с помощью которого он был зарегистрирован, и это имя типа может быть использовано в качестве целевого типа в подключении или как любой другой идентификатор типа. Одно исключение из этого правила состоит в том, что свойство синглтон-типа не может быть переименовано (потому что имя синглтон-типа не идентифицирует объект в рамках того же компонента, что и любой другой элемент).

Использование:

// First, define your QML singleton type which provides the functionality.
pragma Singleton
import QtQuick 2.0
Item {
    property int testProp1: 125
}
// Second, register the QML singleton type by calling this function in an initialization function.
qmlRegisterSingletonType(QUrl("file:///absolute/path/SingletonType.qml"), "Qt.example.qobjectSingleton", 1, 0, "RegisteredSingleton");

Для использования зарегистрированного синглтон-типа в QML необходимо импортировать синглтон-тип.

import QtQuick 2.0
import Qt.example.qobjectSingleton 1.0
Item {
    id: root
    property int someValue: RegisteredSingleton.testProp1
}

Также возможно регистрация QML-синглтон-типов без использования функции qmlRegisterSingletonType. Это можно сделать, добавив в файл QML типа среди инструкций импорта псевдоним Singleton. Кроме того, тип должен быть определён в файле qmldir со словом singleton, а qmldir должен быть импортирован файлами QML, использующими синглтон.

См. также QML_SINGLETON.

template <typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Эта шаблонная функция регистрирует тип C++ в системе QML с именем qmlName в библиотеке, импортированной из uri с номером версии, состоящим из versionMajor и versionMinor.

Возвращает идентификатор QML-типа.

Существуют две формы этой шаблонной функции:

template<typename T>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

template<typename T, int metaObjectRevision>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

Первая — это стандартная форма, которая регистрирует тип T как новый тип. Вторая позволяет зарегистрировать определённую редакцию класса в указанной версии (см. Редакции и версии типов).

Например, это регистрирует класс C++ MySliderItem как QML-тип под именем Slider для версии 1.0 пространства имён типа "com.mycompany.qmlcomponents":

qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");

После регистрации этот тип можно использовать в QML, импортировав указанное пространство имён типа и номер версии:

import com.mycompany.qmlcomponents 1.0

Slider {
    // ...
}

Обратите внимание, что для библиотеки вполне приемлемо регистрировать типы для более ранних версий, чем фактическая версия библиотеки. Действительно, обычно новая библиотека позволяет QML, написанному для предыдущих версий, продолжать работать, даже если доступны более продвинутые версии некоторых её типов.

См. также QML_ELEMENT, QML_NAMED_ELEMENT() и Выбор правильного метода интеграции между C++ и QML.

int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Данная функция регистрирует тип в системе QML с именем qmlName в библиотеке, импортируемой из uri с номером версии, состоящим из versionMajor и versionMinor. Тип определяется файлом QML, расположенным по адресу url. URI должен быть абсолютным, т.е. url.isRelative() == false.

Обычно файлы QML могут загружаться как типы непосредственно из других файлов QML или с помощью файла qmldir. Данная функция позволяет регистрировать файлы в типы из кода C++, например, когда соответствие типов необходимо определять процедурно при запуске.

Возвращает -1, если регистрация не удалась.

int qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)

Эта функция регистрирует тип в системе QML с именем qmlName в пространстве имён типа, импортированном из uri, имеющем номер версии, составленный из versionMajor и versionMinor, но любая попытка создать экземпляр типа вызовет указанную ошибку message.

Обычно типы, экспортируемые плагином, должны быть фиксированными. Однако, если тип C++ недоступен, вы должны хотя бы «зарезервировать» имя QML типа и предоставить пользователю недоступного типа понятное сообщение об ошибке.

Возвращает идентификатор QML типа.

Пример:

#ifdef NO_GAMES_ALLOWED
qmlRegisterTypeNotAvailable("MinehuntCore", 0, 1, "Game", "Get back to work, slacker!");
#else
qmlRegisterType<MinehuntGame>("MinehuntCore", 0, 1, "Game");
#endif

Это приведет к тому, что любой QML, который импортирует пространство имен типа «MinehuntCore» и пытается использовать тип, выведет сообщение об ошибке:

fun.qml: Get back to work, slacker!
   Game {
   ^

Без этого было бы выведено общее сообщение «Игра не является типом».

См. также QML_UNAVAILABLE, qmlRegisterUncreatableType() и Выбор правильного метода интеграции между C++ и QML.

int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)

Эта функция регистрирует staticMetaObject и её расширение в системе QML с именем qmlName в библиотеке, импортированной из uri, имеющей номер версии, составленный из versionMajor и versionMinor.

Экземпляр метаобъекта создать нельзя. При попытке его создания будет выведено сообщение об ошибке с заданным сообщением reason.

Эта функция полезна для регистрации пространств имён Q_NAMESPACE.

Возвращает идентификатор QML типа.

Например:

namespace MyNamespace {
  Q_NAMESPACE
  enum MyEnum {
      Key1,
      Key2,
  };
  Q_ENUMS(MyEnum)
}

//...
qmlRegisterUncreatableMetaObject(MyNamespace::staticMetaObject, "io.qt", 1, 0, "MyNamespace", "Access to enums & flags only");

На стороне QML теперь можно использовать зарегистрированные перечисления:

Component.onCompleted: console.log(MyNamespace.Key2)

Эта функция была добавлена в Qt 5.8.

См. также QML_ELEMENT, QML_NAMED_ELEMENT() и QML_UNCREATABLE().

template <typename T> int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)

Эта шаблонная функция регистрирует тип C++ в системе QML с именем qmlName в библиотеке, импортированной из uri, имеющей номер версии, составленный из versionMajor и versionMinor.

Хотя тип имеет имя и тип, он не может быть создан, и при попытке создания будет отображено заданное сообщение об ошибке message.

Это полезно в случаях, когда тип предназначен только для предоставления присоединённых свойств или значений перечислений.

Возвращает идентификатор QML типа.

См. также QML_UNCREATABLE(), qmlRegisterTypeNotAvailable() и Выбор правильного метода интеграции между C++ и QML.

int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Возвращает идентификатор QML типа, который был зарегистрирован с именем qmlName в определённом uri и версии, указанной в versionMajor и versionMinor.

Эта функция возвращает то же значение, что и функции регистрации QML типов, такие как qmlRegisterType() и qmlRegisterSingletonType().

Если qmlName, uri и versionMajor соответствуют зарегистрированному типу, но указанная в versionMinor версия менее актуальна, то возвращается id типа с наиболее близкой мажорной версией.

Возвращает -1, если соответствующий тип не был найден или один из параметров некорректен.

Эта функция была добавлена в Qt 5.12.

См. также QML_ELEMENT, QML_NAMED_ELEMENT, QML_SINGLETON, qmlRegisterType() и qmlRegisterSingletonType().

Документация макросов

QML_ADDED_IN_MINOR_VERSION(VERSION)

Объявляет, что окружающий тип или пространство имён были добавлены в указанную версию VERSION, относительно основной версии модуля. Небольшая версия предполагается соответствующей любым изменениям, заданным макросами Q_REVISION() для методов, слотов или сигналов, и любым тегам REVISION для свойств, объявленных с помощью Q_PROPERTY().

QML_ADDED_IN_MINOR_VERSION() срабатывает только в том случае, если тип или пространство имён доступны в QML, благодаря наличию макроса QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS или QML_INTERFACE.

Если модуль QML, к которому принадлежит тип, импортирован с более низкой версией, чем определено таким образом, то QML-тип будет невидим.

См. также QML_ELEMENT и QML_NAMED_ELEMENT().

QML_ANONYMOUS

Объявляет, что окружающий тип доступен, но анонимный в QML. Тип нельзя создать или использовать в качестве типа свойства, но при передаче из C++ он распознается.

См. также QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE() и QML_INTERFACE.

QML_ATTACHED(ATTACHED_TYPE)

Объявляет, что окружающий тип присоединяет ATTACHED_TYPE как присоединённое свойство к другим типам. Это срабатывает, если тип экспортирован в QML с помощью макроса QML_ELEMENT или QML_NAMED_ELEMENT().

См. также QML_ELEMENT, QML_NAMED_ELEMENT(), qmlAttachedPropertiesObject() и Обеспечение присоединенных свойств.

QML_DECLARE_TYPE

Эквивалентно Q_DECLARE_METATYPE(TYPE *) и Q_DECLARE_METATYPE(QQmlListProperty<TYPE>)

QML_DECLARE_TYPEINFO(Type, Flags)

Объявляет дополнительные свойства данного Type, как описано в указанных Flags.

В настоящее время поддерживается только информация о типе QML_HAS_ATTACHED_PROPERTIES, которая объявляет, что Type поддерживает присоединенные свойства. QML_DECLARE_TYPEINFO() не требуется, если Type содержит макрос QML_ATTACHED.

QML_ELEMENT

Объявляет, что окружающий тип или пространство имён доступен в QML, используя имя класса или пространства имён в качестве имени QML элемента.

Например, это делает C++ класс Slider доступным как QML-тип с именем Slider.

class Slider : public QObject
{
    Q_OBJECT
    QML_ELEMENT
    ...
}

Вы можете использовать систему сборки для регистрации типа в пространстве имён типа com.mycompany.qmlcomponents с основной версией 1, указав следующее в файле проекта:

CONFIG += qmltypes
QML_IMPORT_NAME = com.mycompany.qmlcomponents
QML_IMPORT_MAJOR_VERSION = 1

После регистрации тип может использоваться в QML путём импорта того же пространства имён типа и номера версии:

import com.mycompany.qmlcomponents 1.0

Slider {
    // ...
}

Вы также можете сделать пространства имён, помеченные с помощью Q_NAMESPACE, доступными таким образом, чтобы экспортировать любые перечисления, помеченные с помощью Q_ENUM_NS, которые они содержат.

См. также Выбор правильного метода интеграции между C++ и QML, QML_NAMED_ELEMENT(), Q_REVISION() и QML_ADDED_IN_MINOR_VERSION().

QML_EXTENDED(EXTENDED_TYPE)

Объявляет, что окружающий тип использует EXTENDED_TYPE как расширение для предоставления дополнительных свойств и методов в QML. Это срабатывает, если тип экспортирован в QML с помощью макроса QML_ELEMENT или QML_NAMED_ELEMENT().

См. также QML_ELEMENT, QML_NAMED_ELEMENT() и Регистрация объектов расширения.

QML_FOREIGN(FOREIGN_TYPE)

Объявляет, что любые макросы QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS, QML_INTERFACE, QML_UNCREATABLE(), QML_SINGLETON, QML_ADDED_IN_MINOR_VERSION(), QML_REMOVED_IN_MINOR_VERSION(), QML_ATTACHED() или QML_EXTENDED() в окружающем C++ типе не применяются к окружающему типу, а вместо этого к FOREIGN_TYPE. Окружающий тип всё ещё должен быть зарегистрирован в системе метаобъектов с помощью макроса Q_GADGET или Q_OBJECT.

Это полезно для регистрации типов, которые нельзя изменить для добавления макросов, например, потому что они принадлежат библиотекам сторонних производителей.

См. также QML_ELEMENT и QML_NAMED_ELEMENT().

QML_INTERFACE

Этот макрос регистрирует окружающий C++ тип в системе QML как интерфейс.

Типы, зарегистрированные как интерфейсы в QML, также должны объявлять себя как интерфейсы в системе метаобъектов. Например:

struct FooInterface
{
    QML_INTERFACE
public:
    virtual ~FooInterface();
    virtual void doSomething() = 0;
};

Q_DECLARE_INTERFACE(FooInterface, "org.foo.FooInterface")

При регистрации в QML таким образом, они могут быть использованы в качестве типов свойств:

Q_PROPERTY(FooInterface *foo READ foo WRITE setFoo)

Когда вы назначаете подкласс QObject этому свойству, движок QML автоматически выполняет приведение интерфейса к FooInterface*.

Типы интерфейсов неявно анонимны и несоздаваемые в QML.

См. также QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE() и QML_ANONYMOUS.

QML_NAMED_ELEMENT(name)

Объявляет окружающий тип или пространство имён, как доступный в QML, используя name в качестве имени элемента. В противном случае работает аналогично QML_ELEMENT.

class SqlEventDatabase : public QObject
{
    Q_OBJECT
    QML_NAMED_ELEMENT(EventDatabase)

    // ...
};

См. также Выбор правильного метода интеграции между C++ и QML и QML_ELEMENT.

QML_REMOVED_IN_MINOR_VERSION(VERSION)

Объявляет, что окружающий тип или пространство имён было удалено в указанной версию VERSION, относительно основной версии модуля. Это в первую очередь полезно при замене реализации QML-типа. Если соответствующий макрос QML_ADDED_IN_MINOR_VERSION() присутствует в другом типе или пространстве имён с тем же именем QML, то удаленный тип используется при импорте версий модуля ниже VERSION, а добавленный тип используется при импорте версий модуля равных или выше VERSION.

QML_REMOVED_IN_MINOR_VERSION() срабатывает только в том случае, если тип или пространство имён доступны в QML, благодаря наличию макроса QML_ELEMENT, QML_NAMED_ELEMENT(), QML_ANONYMOUS или QML_INTERFACE.

См. также QML_ELEMENT и QML_NAMED_ELEMENT().

QML_SINGLETON

Объявляет окружающий тип как синглтон в QML. Это срабатывает только в том случае, если тип доступен в QML, благодаря наличию макроса QML_ELEMENT или QML_NAMED_ELEMENT(). По умолчанию каждый QQmlEngine попытается создать экземпляр синглтона, используя конструктор по умолчанию типа, когда тип впервые обращается. Если конструктор по умолчанию отсутствует, синглтон изначально недоступен. Это поведение можно переопределить, вызвав qmlRegisterSingletonType() с конкретной функцией фабрики или qmlRegisterSingletonInstance() с конкретным экземпляром для того же класса и того же пространства имён типа и версии.

См. также QML_ELEMENT, QML_NAMED_ELEMENT() и qmlRegisterSingletonInstance().

QML_UNAVAILABLE

Этот макрос объявляет окружающий тип как недоступный в QML. Он регистрирует внутренний заглушечный тип, называемый QQmlTypeNotAvailable, как QML_FOREIGN() тип, используя любые дополнительные QML макросы, которые вы указываете.

Обычно типы, экспортируемые модулем, должны быть неизменными. Однако, если C++ тип недоступен, вы должны хотя бы "зарезервировать" имя QML-типа и дать пользователю недоступного типа понятное сообщение об ошибке.

Пример:

#ifdef NO_GAMES_ALLOWED
struct MinehuntGame
{
    Q_GADGET
    QML_NAMED_ELEMENT(Game)
    QML_UNAVAILABLE
    QML_UNCREATABLE("Get back to work, slacker!");
};
#else
class MinehuntGame : public QObject
{
    Q_OBJECT
    QML_NAMED_ELEMENT(Game)
    // ...
};
#endif

Это заставит любой QML, пытающийся использовать тип "Game", вывести сообщение об ошибке:

fun.qml: Get back to work, slacker!
   Game {
   ^

Используя эту технику, вам нужен только Q_GADGET структура для настройки сообщения об ошибке, а не полноценный QObject. Без QML_UNCREATABLE(), QML_UNAVAILABLE всё равно даёт более конкретное сообщение об ошибке, чем обычное "не является типом" для совершенно неизвестных типов.

См. также QML_ELEMENT, QML_NAMED_ELEMENT(), QML_UNCREATABLE() и QML_FOREIGN().

QML_UNCREATABLE(reason)

Объявляет, что окружающий тип не может быть создан из QML. Это вступает в силу, если тип доступен в QML, имея макрос QML_ELEMENT или QML_NAMED_ELEMENT(). При попытке создать тип из QML будет выведено сообщение об ошибке с указанием причины.

Некоторые типы QML неявно не могут быть созданы, в частности, типы, экспонируемые с помощью QML_ANONYMOUS или пространства имен, экспонируемые с помощью QML_ELEMENT или QML_NAMED_ELEMENT(). Для таких типов QML_UNCREATABLE() можно использовать для предоставления настраиваемого сообщения об ошибке.

См. также QML_ELEMENT, QML_NAMED_ELEMENT() и QML_ANONYMOUS.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qqmlengine.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API