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++.