Встраивание объектов 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. См. следующие примеры:
демонстрирующие использование 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-5.15/qtqml-cppintegration-contextproperties.html