Spec-Zone.ru › Qt 6.1

Класс QQmlEngine

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

Заголовок: #include <QQmlEngine>
CMake: find_package(Qt6 COMPONENTS Qml REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
С тех пор: Qt 5.0
Наследует: QJSEngine
Наследуется от:

QQmlApplicationEngine

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

Свойства

  • путьХраненияОфлайн : QString

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

QQmlEngine(QObject *parent = nullptr)
virtual ~QQmlEngine() override
void добавитьПровайдерИзображений(const QString &providerId, QQmlImageProviderBase *provider)
void добавитьПутьИмпорта(const QString &path)
void добавитьПутьПлагина(const QString &path)
void добавитьПерехватчикUrl(QQmlAbstractUrlInterceptor *urlInterceptor)
QUrl базовыйUrl() const
void очиститьКэшКомпонентов()
QQmlImageProviderBase * провайдерИзображений(const QString &providerId) const
QStringList списокПутейИмпорта() const
bool импортироватьПлагин(const QString &filePath, const QString &uri, QList<QQmlError> *errors)
QQmlIncubationController * контроллерИнкубации() const
QUrl перехватитьUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const
QNetworkAccessManager * менеджерСетевогоДоступа() const
QQmlNetworkAccessManagerFactory * фабрикаМенеджераСетевогоДоступа() const
QString путьКФайлуБазыДанныхОфлайнХранилища(const QString &databaseName) const
QString путьХраненияОфлайн() const
bool выводитьПредупрежденияВСтандартнуюОшибка() const
QStringList списокПутейПлагинов() const
void удалитьПровайдерИзображений(const QString &providerId)
void удалитьПерехватчикUrl(QQmlAbstractUrlInterceptor *urlInterceptor)
QQmlContext * корневойКонтекст() const
void установитьБазовыйUrl(const QUrl &url)
void установитьСписокПутейИмпорта(const QStringList &paths)
void установитьКонтроллерИнкубации(QQmlIncubationController *controller)
void установитьФабрикуМенеджераСетевогоДоступа(QQmlNetworkAccessManagerFactory *factory)
void установитьПутьХраненияОфлайн(const QString &dir)
void установитьВыводПредупрежденийВСтандартнуюОшибка(bool enabled)
void установитьСписокПутейПлагинов(const QStringList &paths)
T экземплярSingleton(int qmlTypeId)
void обрезатьКэшКомпонентов()

Открытые слоты

void перевестиЗаново()

Сигналы

void выйти(int retCode)
void выйти()
void предупреждения(const QList<QQmlError> &warnings)

Статические открытые члены

QQmlContext * контекстДляОбъекта(const QObject *object)
void установитьКонтекстДляОбъекта(QObject *object, QQmlContext *context)

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

virtual bool событие(QEvent *e) override

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

QObject * qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
void qmlClearTypeRegistrations()
QQmlContext * qmlContext(const QObject *object)
QQmlInfo qmlDebug(const QObject *object)
QQmlEngine * qmlEngine(const QObject *object)
QQmlInfo qmlInfo(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)
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)
QQmlInfo qmlWarning(const QObject *object)

Макросы

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_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE)
QML_FOREIGN(FOREIGN_TYPE)
QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE)
QML_IMPLEMENTS_INTERFACES(interfaces)
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 будет создан в корневом контексте (root context) движка.

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

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

путьОтсутствующегоХранилища : QString

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

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

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

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

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

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

QString путьОтсутствующегоХранилища() const
void установитьПутьОтсутствующегоХранилища(const QString &dir)

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

QQmlEngine::QQmlEngine(QObject *parent = nullptr)

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

[signal, since 5.8] void QQmlEngine::exit(int retCode)

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

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

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

[signal] void QQmlEngine::quit()

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

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

[slot, since 5.10] void QQmlEngine::retranslate()

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

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

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

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

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

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

[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().

void QQmlEngine::addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)

Добавляет urlInterceptor для использования при разрешении URL в QML. Это также относится к URL, используемым для загрузки файлов скриптов и типов QML. URL-интерцепторы не должны изменяться во время загрузки файлов движком, иначе выбор URL может быть несогласованным. Если задано несколько URL-интерцепторов, они будут вызываться в порядке их добавления для каждого URL.

QQmlEngine не принимает владение интерцептором и не будет его удалять.

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

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

QQmlIncubationController *QQmlEngine::incubationController() const

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

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

QUrl QQmlEngine::interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const

Выполняет текущие URL-интерцепторы на заданном url указанного type и возвращает результат.

QNetworkAccessManager *QQmlEngine::networkAccessManager() const

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

END_OF_DOCUMENT_MARKER

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

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

QQmlNetworkAccessManagerFactory *QQmlEngine::networkAccessManagerFactory() const

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

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

[since 5.9] QString QQmlEngine::offlineStorageDatabaseFilePath(const QString &databaseName) const

Возвращает путь к файлу базы данных Локального хранилища с идентификатором 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.

void QQmlEngine::removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)

Удаляет urlInterceptor, который был ранее добавлен с помощью addUrlInterceptor. URL-интерцепторы не должны изменяться во время загрузки файлов движком, иначе выбор URL может быть несогласованным.

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

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().

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().

[since 5.12] 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().

[since 5.9] QQmlInfo qmlDebug(const QObject *object)

Выводит сообщения отладки, которые включают файл и номер строки для указанного QML-объекта object.

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

Для включения файла и номера строки необходимо передать объект. Если файл и номер строки недоступны для этого экземпляра (либо он не был создан движком QML, либо информация о местоположении отключена), вместо этого используется «неизвестное местоположение». Например,

qmlDebug(object) << "Internal state: 42";

выводит

QML MyCustomType (unknown location): Internal state: 42

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

См. также qmlInfo и qmlWarning.

QQmlEngine *qmlEngine(const QObject *object)

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

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

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

QQmlInfo qmlInfo(const QObject *object)

Выводит информационные сообщения, которые включают файл и номер строки для указанного QML-объекта object.

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

Для включения файла и номера строки необходимо передать объект. Если файл и номер строки недоступны для этого экземпляра (либо он не был создан движком QML, либо информация о местоположении отключена), вместо этого используется «неизвестное местоположение».

Например,

qmlInfo(object) << tr("component property is a write-once property");

выводит

QML MyCustomType (unknown location): component property is a write-once property

Примечание: В версиях до Qt 5.9 qmlInfo сообщал сообщения, используя предупреждение QtMsgType. В Qt 5.9 и выше qmlInfo использует информационное QtMsgType. Для отправки предупреждений используйте qmlWarning.

См. также qmlDebug и qmlWarning.

bool qmlProtectModule(const char *uri, int majVersion)

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

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

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

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

[since 5.14] 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().

[since 5.9] 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);

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

[since 5.14] 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.

ПРИМЕЧАНИЕ: qmlRegisterSingleton может использоваться только тогда, когда все типы данного модуля зарегистрированы процедурно.

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

// 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.

[since 5.14] 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. Url должен быть абсолютным, т.е. url.isRelative() == false.

Кроме того, файл QML типа должен содержать директиву pragma 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. Это можно сделать, добавив директиву pragma Singleton среди инструкций импорта файла QML типа. Кроме того, тип должен быть определен в файле 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. url должен быть абсолютным URL-адресом, т.е. 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.

[since 5.8] 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.

[since 5.12] int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName)

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

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

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

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

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

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

[since 5.9] QQmlInfo qmlWarning(const QObject *object)

Выводит сообщения об ошибках, которые включают файл и номер строки для указанного объекта QML object.

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

Для включения файла и номера строки необходимо передать объект. Если файл и номер строки недоступны для данного экземпляра (либо он не был создан движком QML, либо информация о местоположении отключена), вместо этого будет использоваться «неизвестное местоположение».

Например,

qmlInfo(object) << tr("property cannot be set to 0");

выводит

QML MyCustomType (unknown location): property cannot be set to 0

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

См. также qmlDebug и qmlInfo.

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

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, которые они содержат.

ПРИМЕЧАНИЕ: Когда классы имеют одинаковое имя, но находятся в разных пространствах имён, использование QML_ELEMENT для обоих из них вызовет конфликт. Убедитесь, что используете QML_NAMED_ELEMENT() для одного из них вместо этого.

См. также Выбор правильного метода интеграции между 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_EXTENDED_NAMESPACE() и Регистрация объектов расширения.

QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE)

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

Например, рассмотрим следующий C++ код

namespace MyNamespace {
    Q_NAMESPACE
    enum MyEnum { MyEnumerator = 10 };
    Q_ENUM_NS(MyEnum)
}

class QmlType : public QObject
{
    Q_OBJECT
    QML_ELEMENT
    QML_EXTENDED_NAMESPACE(MyNamespace)
}

мы можем получить доступ к перечислению в QML:

QmlType {
    property int i: QmlType.MyEnumerator // i will be 10
}

Примечание: EXTENDED_NAMESPACE также может быть QObject или QGadget; в этом случае — и в отличие от QML_EXTENDED, которое также экспонирует методы и свойства — экспонируются только его перечисления.

Примечание: EXTENDED_NAMESPACE должен иметь метаобъект; то есть это должно быть либо пространство имён, содержащее макрос Q_NAMESPACE, либо QObject/QGadget.

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

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() или QML_EXTENDED_NAMESPACE() в окружающем C++ типе не применяются к окружающему типу, а вместо этого к FOREIGN_TYPE. Окружающий тип всё равно должен быть зарегистрирован в системе метаобъектов с помощью макроса Q_GADGET или Q_OBJECT.

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

ПРИМЕЧАНИЕ: Возможно, вы захотите использовать QML_NAMED_ELEMENT() вместо QML_ELEMENT из-за того, что элемент будет именован как структура, в которой он содержится, а не как внешний тип. Обратитесь к Пример расширения QML — Объекты расширения для примера.

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

QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE)

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

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

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

QML_IMPLEMENTS_INTERFACES(interfaces)

Этот макрос сообщает Qt, какие QML interfaces реализует класс. Этот макрос следует использовать только для взаимодействия с классами, использующими QML_INTERFACE, в противном случае используйте Q_INTERFACES. Он необходим для корректной работы декларативной регистрации через QML_ELEMENT.

См. также QML_INTERFACE и Q_INTERFACES.

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_INTERFACE, используйте QML_IMPLEMENTS_INTERFACES вместо Q_INTERFACES.

См. также QML_IMPLEMENTS_INTERFACES(), 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. Это срабатывает только в том случае, если тип является Q_OBJECT и доступен в QML (имея макрос QML_ELEMENT или QML_NAMED_ELEMENT). По умолчанию каждый QQmlEngine будет пытаться создать экземпляр синглтона, используя либо конструктор по умолчанию типа, либо статическую фабричную функцию с сигнатурой T *create(QQmlEngine *, QJSEngine *), когда тип впервые обращается. Если оба существуют и доступны, предпочтительнее конструктор по умолчанию. Если нет конструктора по умолчанию и нет фабричной функции, синглтон первоначально недоступен.

См. также 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(). reason будет выведен как сообщение об ошибке, если попытка создать тип из QML будет обнаружена.

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

Начиная с Qt 6.0, вы можете использовать "" вместо причины, чтобы использовать стандартное сообщение.

См. также 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-6.1/qqmlengine.html

Spec-Zone.ru

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