Класс 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 |
| Наследуется в: |
Свойства
- 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) |
| void | addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor) |
| 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 |
| QUrl | interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) 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) |
| void | removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor) |
| 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() |
| QList<QQmlAbstractUrlInterceptor *> | urlInterceptors() const |
Открытые слоты
| void | retranslate() |
Сигналы
| void | exit(int retCode) |
| void | quit() |
| void | warnings(const QList<QQmlError> &warnings) |
Статические открытые члены
| QQmlContext * | contextForObject(const QObject *object) |
| void | setContextForObject(QObject *object, QQmlContext *context) |
Переопределённые защищённые функции
| virtual bool | event(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 Глобальный Объект.
Документация свойств
offlineStoragePath : QString
Это свойство содержит директорию для хранения автономных пользовательских данных.
Возвращает директорию, где хранятся SQL и другие автономные данные.
Здесь хранятся SQL базы данных, созданные с openDatabaseSync().
По умолчанию это QML/OfflineStorage в директории прикладных данных пользователя.
Обратите внимание, что путь может не существовать на файловой системе, поэтому вызывающие функции, желающие создать новые файлы в этом местоположении, должны сначала создать его - см. QDir::mkpath().
Функции доступа:
| QString | offlineStoragePath() const |
| void | setOfflineStoragePath(const QString &dir) |
См. такжеl{Qt Quick Локальное хранилище QML Типы}.
Документация по членам-функциям
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()
Очищает внутренний кэш компонентов движка.
Эта функция приводит к уничтожению метаданных свойств всех компонентов, ранее загруженных движком. Все ранее загруженные компоненты и привязки свойств для всех существующих объектов, созданных из этих компонентов, перестанут работать.
Эта функция возвращает движок в состояние, где он не содержит данных загруженных компонентов. Это может быть полезно для загрузки подмножества предыдущего набора компонентов или для загрузки новой версии ранее загруженного компонента.
После очистки кэша компонентов компоненты должны быть загружены, прежде чем можно будет создавать новые объекты.
Примечание: Существующие объекты, созданные из QML-компонентов, сохраняют свои типы, даже если вы очищаете кэш компонентов. Это включает одиночные объекты. Если вы создаёте больше объектов из того же QML-кода после очистки кэша, новые объекты будут иметь другие типы, чем старые. Присвоение такого нового объекта свойству объявленного типа, принадлежащему объекту, созданному до очистки кэша, не сработает.
В качестве общего правила, убедитесь, что объекты, созданные из QML-компонентов, не активны, когда вы очищаете кэш компонентов.
См. также 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.
По умолчанию список содержит директорию исполняемого файла приложения, пути, указанные в переменной окружения QML_IMPORT_PATH, и встроенный QmlImportsPath из 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, созданным в этом движке.
Если установлен QQmlNetworkAccessManagerFactory и QNetworkAccessManager еще не создан, будет использован QQmlNetworkAccessManagerFactory для создания QNetworkAccessManager; в противном случае возвращаемый QNetworkAccessManager не будет иметь настроек прокси или кэша.
См. также setNetworkAccessManagerFactory().
QQmlNetworkAccessManagerFactory *QQmlEngine::networkAccessManagerFactory() const
Возвращает текущий QQmlNetworkAccessManagerFactory.
См. также setNetworkAccessManagerFactory().
[since 5.9] 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.
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.
По умолчанию список содержит каталог исполняемого файла приложения, пути, указанные в переменной среды QML_IMPORT_PATH, и встроенный QmlImportsPath из 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().
QList<QQmlAbstractUrlInterceptor *> QQmlEngine::urlInterceptors() const
Возвращает список активных URL-интерцепторов.
Связанные нечлены
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 был создан экземпляр.
Чтобы включить файл и номер строки, необходимо передать объект. Если файл и номер строки недоступны для этого экземпляра (либо он не был создан 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 был создан экземпляр.
Чтобы включить файл и номер строки, необходимо передать объект. Если файл и номер строки недоступны для этого экземпляра (либо он не был создан 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 QML-движок больше не будет искать новый файл qmldir для загрузки модуля. Он будет повторно использовать загруженные ранее файлы qmldir, хотя. Таким образом, присутствующие в этот момент типы по-прежнему работают. Обратите внимание, что разные QML-движки могут загружать разные модули. Однако защита модуля является глобальной и влияет на все движки. Надгрузка поиска файлов qmldir и загрузки плагинов может быть заметной при медленных файловых системах. Поэтому защита модуля, когда вы уверены, что вам больше не нужно его загружать, может быть хорошей оптимизацией. Учитывайте также, что блокировка модуля влияет не только на плагины, но и на все другие директивы qmldir, такие как import или prefer, а также на любые составные типы или скрипты, объявленные в файле qmldir.
Кроме того, после вызова этой функции любая попытка зарегистрировать C++-типы в этой комбинации uri и major version приведёт к ошибке во время выполнения.
Возвращает 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.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 соответствуют зарегистрированному типу, но указанная версия minor в versionMinor выше, то возвращается идентификатор типа с ближайшей версией minor.
Возвращает -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.
Документация макросов
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. Тип нельзя создать или использовать для объявления свойств в QML, но при передаче из C++, он распознаётся. В 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. Для qmake, укажите следующее в вашем файле проекта:
CONFIG += qmltypes QML_IMPORT_NAME = com.mycompany.qmlcomponents QML_IMPORT_MAJOR_VERSION = 1
С помощью CMake, вы передаёте URI и версию в qt_add_qml_module
qt6_add_qml_module(myapp URI com.mycompany.qmlcomponents VERSION 1.0 )
После регистрации тип можно использовать в 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_SINGLETON:
class MySingleton : public QObject
{
Q_OBJECT
QML_ELEMENT
QML_SINGLETON
// Q_PROPERTY( ... )
public:
// members, Q_INVOKABLE functions, etc.
}; Если класс синглтона не конструктируемый по умолчанию, но его можно изменить, можно добавить функцию-фабрику, чтобы сделать его доступным:
class MySingleton : public QObject
{
Q_OBJECT
QML_ELEMENT
QML_SINGLETON
// Q_PROPERTY( ... )
public:
static MySingleton *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine)
{
MySingleton *result = nullptr;
// Create the object using some custom constructor or factory.
// The QML engine will assume ownership and delete it, eventually.
return result;
}
// members, Q_INVOKABLE functions, etc
}; Если класс нельзя изменить, и он не имеет конструктора по умолчанию или подходящей функции-фабрики, можно предоставить обёртку QML_FOREIGN для определения функции-фабрики:
struct SingletonForeign
{
Q_GADGET
QML_FOREIGN(MySingleton)
QML_SINGLETON
QML_NAMED_ELEMENT(MySingleton)
public:
static MySingleton *create(QQmlEngine *, QJSEngine *engine)
{
MySingleton *result = nullptr;
// Create the instance using some custom constructor or factory.
// The QML engine will assume ownership and delete it, eventually.
return result;
}
}; Наконец, если нужно предоставить один конкретный объект синглтона, создание которого нельзя контролировать, можно вернуть его из функции-фабрики. Это замена функции qmlRegisterSingletonInstance. Если вы вызываете
qmlRegisterSingletonInstance("MyModule", 1, 0, "MySingleton", myObject); где myObject типа MySingleton *, можно сделать следующее вместо этого:
struct SingletonForeign
{
Q_GADGET
QML_FOREIGN(MySingleton)
QML_SINGLETON
QML_NAMED_ELEMENT(MySingleton)
public:
// Initialize this using myObject where you would previously
// call qmlRegisterSingletonInstance().
static MySingleton *s_singletonInstance = nullptr;
static MySingleton *create(QQmlEngine *, QJSEngine *engine)
{
// The instance has to exist before it is used. We cannot replace it.
Q_ASSERT(s_singletonInstance);
// The engine has to have the same thread affinity as the singleton.
Q_ASSERT(engine->thread() == s_singletonInstance->thread());
// There can only be one engine accessing the singleton.
if (s_engine)
Q_ASSERT(engine == s_engine);
else
s_engine = engine;
// Explicitly specify C++ ownership so that the engine doesn't delete
// the instance.
QJSEngine::setObjectOwnership(s_singletonInstance,
QJSEngine::CppOwnership);
return s_singletonInstance;
}
private:
static QJSEngine *s_engine = nullptr;
}; Таким образом, существующий класс MySingleton объявляется QML-синглтоном с именем MySingleton. Можно указать для него экземпляр в любое время до его использования, установив член s_singletonInstance. Никаких изменений в самом MySingleton не требуется.
Примечание: Этот шаблон не работает, если к синглтону обращаются несколько QML-движков или если QML-движок, обращающийся к нему, имеет другую аффинность потока, чем сам объект синглтона. Как показано выше, можно проверить параметры метода create() для идентичности и аффинности потока движка, чтобы в этом убедиться.
См. также 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 можно использовать "" вместо reason, чтобы использовать стандартное сообщение вместо него.
См. также 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.2/qqmlengine.html