Spec-Zone.ru › Qt

Класс QQmlContext

Класс QQmlContext определяет контекст внутри движка QML. Подробнее...

Заголовок: #include <QQmlContext>
CMake: find_package(Qt6 COMPONENTS Qml REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
Наследует: QObject
  • Список всех членов, включая унаследованные

Типы public

Структура PropertyPair

Функции public

QQmlContext(QQmlContext *parentContext, QObject *parent = nullptr)
QQmlContext(QQmlEngine *engine, QObject *parent = nullptr)
виртуальный ~QQmlContext() override
QUrl baseUrl() const
QObject * contextObject() const
QVariant contextProperty(const QString &name) const
QQmlEngine * engine() const
bool isValid() const
QString nameForObject(const QObject *object) const
QObject * objectForName(const QString &name) const
QQmlContext * parentContext() const
QUrl resolvedUrl(const QUrl &src) const
void setBaseUrl(const QUrl &baseUrl)
void setContextObject(QObject *object)
void setContextProperties(const QList<QQmlContext::PropertyPair> &properties)
void setContextProperty(const QString &name, QObject *value)
void setContextProperty(const QString &name, const QVariant &value)

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

Контексты позволяют данным быть доступными компонентам QML, созданным движком QML.

Каждый QQmlContext содержит набор свойств, отличных от свойств QObject, которые позволяют явно привязать данные к контексту по имени. Свойства контекста определяются и обновляются вызовом QQmlContext::setContextProperty(). Следующий пример показывает привязку модели Qt к контексту и последующий доступ к ней из файла QML.

QQmlEngine engine;
QStringListModel modelData;
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextProperty("myModel", &modelData);

QQmlComponent component(&engine);
component.setData("import QtQuick 2.0; ListView { model: myModel }", QUrl());
QObject *window = component.create(context);

Примечание: Создатель обязан удалить любой построенный им QQmlContext. Если объект context в примере больше не нужен, когда экземпляр компонента window уничтожен, context должен быть явно уничтожен. Самый простой способ гарантировать это – назначить window родителем context.

Для упрощения привязки и поддержки больших наборов данных, на QQmlContext можно задать объект контекста. Все свойства объекта контекста доступны по имени в контексте, как будто они были добавлены индивидуально с помощью вызовов QQmlContext::setContextProperty(). Изменения значений свойств обнаруживаются через сигнал уведомления свойства. Назначение объекта контекста является одновременно быстрее и проще, чем ручное добавление и поддержка значений свойств контекста.

Следующий пример имеет тот же эффект, что и предыдущий, но использует объект контекста.

class MyDataSet : public QObject {
    // ...
    Q_PROPERTY(QAbstractItemModel *myModel READ model NOTIFY modelChanged)
    // ...
};

MyDataSet myDataSet;
QQmlEngine engine;
QQmlContext *context = new QQmlContext(engine.rootContext());
context->setContextObject(&myDataSet);

QQmlComponent component(&engine);
component.setData("import QtQuick 2.0; ListView { model: myModel }", QUrl());
component.create(context);

Все свойства, добавленные явно с помощью QQmlContext::setContextProperty(), имеют приоритет над свойствами объекта контекста.

Иерархия контекстов

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

Следующий пример определяет два контекста - context1 и context2. Второй контекст переопределяет свойство контекста "b", унаследованное от первого, новым значением.

QQmlEngine engine;
QQmlContext *context1 = new QQmlContext(engine.rootContext());
QQmlContext *context2 = new QQmlContext(context1);

context1->setContextProperty("a", 9001);
context1->setContextProperty("b", 9001);

context2->setContextProperty("b", 42);

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

Предупреждение: Установление объекта контекста или добавление новых свойств контекста после создания объекта в этом контексте является дорогостоящей операцией (в основном, заставляющей все привязки переоцениваться). Поэтому, по возможности, следует завершить «настройку» контекста перед использованием его для создания любых объектов.

См. также Раскрытие атрибутов типов C++ для QML.

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

QQmlContext::QQmlContext(QQmlContext *parentContext, QObject *parent = nullptr)

Создаёт новый QQmlContext с заданным parentContext и родителем QObject parent.

QQmlContext::QQmlContext(QQmlEngine *engine, QObject *parent = nullptr)

Создаёт новый QQmlContext как дочерний элемент корневого контекста engine и родителя QObject parent.

[override virtual] QQmlContext::~QQmlContext()

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

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

QUrl QQmlContext::baseUrl() const

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

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

QObject *QQmlContext::contextObject() const

Возвращает объект контекста или nullptr, если объекта контекста нет.

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

QVariant QQmlContext::contextProperty(const QString &name) const

Возвращает значение свойства name для данного контекста в виде QVariant. Если вам известно, что искомое свойство – это QObject, назначенный с помощью QML id в текущем контексте, objectForName() более удобен и быстр. В отличие от objectForName() и nameForObject(), этот метод проходит по иерархии контекстов и ищет в родительских контекстах, если name не найден в текущем. Он также учитывает заданный вами contextObject().

См. также setContextProperty(), objectForName(), nameForObject() и contextObject().

QQmlEngine *QQmlContext::engine() const

Возвращает QQmlEngine контекста или nullptr, если контекст не имеет QQmlEngine или QQmlEngine был уничтожен.

bool QQmlContext::isValid() const

Возвращает, является ли контекст действительным.

Для того чтобы контекст был действительным, он должен иметь движок, и его contextObject, если таковой есть, не должен быть удалён.

QString QQmlContext::nameForObject(const QObject *object) const

Возвращает имя объекта object в данном контексте или пустую строку, если object не имеет имени в контексте. Объекты получают имена с помощью setContextProperty() или в качестве свойств объекта контекста, или по идентификаторам в случае контекстов, созданных QML.

Если у объекта несколько имён, возвращается первое.

В отличие от contextProperty(), этот метод не просматривает иерархию контекстов. Если имя не найдено в текущем контексте, возвращается пустая строка.

См. также contextProperty() и objectForName().

[since 6.2] QObject *QQmlContext::objectForName(const QString &name) const

Возвращает объект с заданным именем name в данном контексте. Возвращает nullptr, если name не доступно в контексте или если значение, связанное с name, не является QObject. Объекты получают имена с помощью setContextProperty() или в качестве свойств объекта контекста, или по идентификаторам в случае контекстов, созданных QML. В отличие от contextProperty(), этот метод не просматривает иерархию контекстов. Если имя не найдено в текущем контексте, возвращается nullptr.

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

См. также contextProperty() и nameForObject().

QQmlContext *QQmlContext::parentContext() const

Возвращает родительский контекст QQmlContext или nullptr, если у текущего контекста нет родителя или родитель был уничтожен.

QUrl QQmlContext::resolvedUrl(const QUrl &src) const

Разрешает URL src относительно URL содержащего компонента.

См. также QQmlEngine::baseUrl() и setBaseUrl().

void QQmlContext::setBaseUrl(const QUrl &baseUrl)

Явно устанавливает URL resolvedUrl(), который будет использоваться для относительных ссылок к baseUrl.

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

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

void QQmlContext::setContextObject(QObject *object)

Устанавливает объект контекста object.

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

[since 5.11] void QQmlContext::setContextProperties(const QList<QQmlContext::PropertyPair> &properties)

Устанавливает пакет свойств properties в этом контексте.

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

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

См. также QQmlContext::setContextProperty().

void QQmlContext::setContextProperty(const QString &name, QObject *value)

Устанавливает значение value свойства name в этом контексте.

QQmlContext не принимает владение value.

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

void QQmlContext::setContextProperty(const QString &name, const QVariant &value)

Устанавливает значение value свойства name в этом контексте.

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

Spec-Zone.ru

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