Интеграция QML с C++ и JavaScript

Интеграция QML с C++ и свойства контекста

Последнее обновление: 01.01.2024

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

Взаимодействие между QML и C++ в Qt

В файле 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++ через свойства контекста в Qt

Такой способ удобен для небольших приложений, когда нам надо передать в QML какие-нибудь простые данные из C++.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850