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

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

QML хорошо интегрируется с JS и использует синтаксис, подобный JSON, что позволяет определять выражения и методы как функции JS. Логику приложения Qt Quick можно определить в виде кода javascript. Причем код JavaScript можно написать внутри файла QML или в отдельном JS-файле, который можно затем импортировать в приложение. Для выполнения кода JavaScript QML предоставляет соответствующую среду, которая, однако, имеет некоторые ограничения по сравнению с аналогичной средой веб-браузера.

Например, определим функцию с кодом JS в файле QML:

import QtQuick
import QtQuick.Controls

Window {
    width: 250
    height: 200
    visible: true
    title: "METANIT.COM"

    // обработчик нажатия кнопки
    function btnClicked(controlName, content) {
        controlName.text = content
    }
    Column{
        padding: 5
        spacing: 5
        Button {
            text:"Click"
            onClicked: btnClicked(header, "Text Clicked")
        }
        Text {
            id: header
            text: "Hello"
            font.pixelSize: 18
        }
    }
}

Здесь по нажатию на кнопку вызывается JS-функция btnClicked, в которую передается объект и устанавливаемый для него текст.

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

Подключение файлов JavaScript

Если код большой или в проекте много файлов, где надо использовать один и тот же функционал JavaScript, то код JS можно вынести в отдельный файл. Например, добавим в Ct Creator файл JavaScript. Для этого нажмем на узел Source Files и в контекстном меню выберем пункт Add New...

Добавление файла JavaScript в Qt Creator

Далее среди шаблонов нового элемента выберем шаблон JS File

Добавление файла JavaScript в среде Qt Creator

На следующем окне дадим файлу какое-нибудь имя, например, "hello" (расширение js указывать необязательно)

Добавление JavaScript-файла в Qt Creator

На последующих шагах оставим все опции по умолчанию. В итоге в проект будет добавлен файл, в котором можно будет определить код JavaScript

Интеграция JavaScript и QML в Qt

Стоит отметить, что при добавлении в проект js-файла в файл конфигурации проекта CMakeLists.txt автоматически добавляется соответствующий пункт:

qt_add_qml_module(
    # остальное содержимое
    QML_FILES hello.js
)

Определим в JavaScript-файле простейший код:

let clicks = 0;
// текст кнопки
const btnText = "Click";
// обработчик нажатия кнопки
function btnClicked(controlName) {
    clicks++;
    controlName.text = "Clicks count: " + clicks;
}

Здесь определены переменная clicks (счетчик нажатий), константа btnText (текст кнопки) и функция btnClicked, которая будет представлять обработчик нажатия кнопки и будет принимать идентификатор изменяемого элемента. В этой функции увеличиваем счетчик нажатий и изменяем соответствующим образом текст элемента.

В файле main.qml подключим этот файл:

import QtQuick
import QtQuick.Controls

import "hello.js" as Hello  // подключение js-файла

Window {
    width: 250
    height: 200
    visible: true
    title: "METANIT.COM"


    Column{
        padding: 5
        spacing: 5
        Button {
            text: Hello.btnText
            onClicked: Hello.btnClicked(header)
        }
        Text {
            id: header
            text: "Hello"
            font.pixelSize: 18
        }
    }
}

Для подключения js-файла применяется выражение

import js_файл as идентификатор

То есть вся функциональность подключаемого js-файла проектируется на определенный идентификатор, через который можно обращаться к данной функциональности. То есть в данном случае функциональность файла "hello.js" будет доступна через идентификатор Hello. Например, мы можем назначить кнопке в качестве текста значение константы btnText, а в качестве обработчика функцию btnClicked, определенную в JavaScript-файле:

text: Hello.btnText
onClicked: Hello.btnClicked(header)

Таким образом, при нажатии будет увеличиваться счетчик и соотвест образом изменяться текст элемента Text:

Вызов функций JavaScript и QML в Qt
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850