Spec-Zone.ru › Qt 6.1

Встраивание объектов C++ в QML с помощью свойств контекста

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

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

Установка простого свойства контекста

Например, вот элемент QML, который ссылается на значение currentDateTime, отсутствующее в текущей области видимости:

// MyItem.qml
import QtQuick 2.0

Text { text: currentDateTime }

Это значение currentDateTime можно установить напрямую приложением C++, загружающим компонент QML, используя QQmlContext::setContextProperty():

QQuickView view;
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();

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

Установка объекта в качестве свойства контекста

Свойства контекста могут содержать значения QVariant или QObject*. Это означает, что пользовательские объекты C++ также можно встраивать с помощью этого подхода, и эти объекты можно напрямую изменять и читать в QML. Здесь мы изменяем приведенный выше пример, чтобы встроить экземпляр QObject вместо значения QDateTime, а код QML вызывает метод на экземпляре объекта:

C++
class ApplicationData : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
        return QDateTime::currentDateTime();
    }
};

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;

    ApplicationData data;
    view.rootContext()->setContextProperty("applicationData", &data);

    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
    view.show();

    return app.exec();
}
QML
// MyItem.qml
import QtQuick 2.0

Text { text: applicationData.getCurrentDateTime() }

(Обратите внимание, что значения даты/времени, возвращаемые из C++ в QML, можно форматировать с помощью Qt.formatDateTime() и связанных функций.)

Если элемент QML должен получать сигналы от свойства контекста, он может подключиться к ним с помощью типа Подключения. Например, если ApplicationData имеет сигнал с именем dataChanged(), этот сигнал можно подключить к обработчику onDataChanged внутри объекта Подключения:

Text {
    text: applicationData.getCurrentDateTime()

    Connections {
        target: applicationData
        onDataChanged: console.log("The application data changed!")
    }
}

Свойства контекста могут быть полезны для использования моделей данных на основе C++ в представлении QML. Рассмотрите следующие примеры:

  • Список строк Model
  • Список объектов Model
  • AbstractItemModel

демонстрирующие использование моделей на основе QStringList, QList<QObject*> и QAbstractItemModel в представлениях QML.

Также см. документацию по QQmlContext для получения дополнительной информации.

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

Spec-Zone.ru

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