QML позволяет определить некоторую простейшую логику по работе с элементами графического интерфейса, например, нажатие на кнопку и так далее. Однако если речь идет о выполнении сложных и ресурсоемких задач, то такие задачи обычно определяются в коде C++. Соответственно встает вопрос интеграции кода QML и C++. Однако QML можно легко интегрировать с кодом C++. Qt позволяет в коде на C++ загружать и изменять объекты QML. Аналогично из кода QML можно вызывать код C++. Это помогает создавать гибридные приложения на основе C++, QML и JS.
Рассмотрим различные варианты интеграции QML и C++.
Для простейшего взаимодействия QML и С++ применяются свойства контекста (context properties). В этом случае объект C++ передается в QML через контекст в виде глобального объекта. А свойства контекста позволяют обратиться к переданному объекта C++.
Возьмем простейший проект, где у нас есть файл main.qml с определением графического интерфейса и файл main.cpp с кодом загрузки приложения на C++:
В файле main.cpp определим следующий код:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext> // добавляем определение контекста QML
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
// устанавливаем свойство контекста "textContent"
engine.rootContext()->setContextProperty("textContent", "Hello METANIT.COM");
// устанавливаем свойство контекста "textSize"
engine.rootContext()->setContextProperty("textSize", 22);
const QUrl url("qrc:/path/main.qml");
engine.load(url);
return app.exec();
}
Прежде всего для использования контекста добавляем определение типа QQmlContext
#include <QQmlContext>
Далее устанавливаем для примера два свойства контекста:
engine.rootContext()->setContextProperty("textContent", "Hello METANIT.COM");
engine.rootContext()->setContextProperty("textSize", 22);
Для установки свойств контекста через метод rootContext() объекта QQmlApplicationEngine получаем текущий контекст QML в виде указателя QQmlContext *. Затем через полученный указатель можно установить свойство контекста методом setContextProperty(). Первый параметр метода - название свойства контекста, а второй параметр - значение свойства.
Так, в данном случае устанавливаем свойство "textContent" (не важно, что изначально такого свойства не существует), и оно будет равно строке "Hello METANIT.COM". Второе свойство называется "textSize", и его значение - число 22.
Теперь обратимся к этим свойствам в коде main.qml:
import QtQuick
Window {
width: 250
height: 200
visible: true
title: "METANIT.COM"
Text {
anchors.centerIn: parent
text: textContent // применяем свойство textContent
font.pixelSize: textSize // применяем свойство textSize
font.family: "Verdana"
}
}
Здесь по имени мы можем обращаться к свойствам контекста и получить их значение:
Такой способ удобен для небольших приложений, когда нам надо передать в QML какие-нибудь простые данные из C++.