Spec-Zone.ru › Qt 5.13

Определение JavaScript-ресурсов в QML

Логика программы для приложения QML может быть определена на JavaScript. JavaScript-код может быть определен непосредственно в документах QML или разделен на JavaScript-файлы (известные как JavaScript Resources в QML).

В QML поддерживаются два типа JavaScript-ресурсов: файлы реализации кода-за-сценой и общие (библиотечные) файлы. Оба типа JavaScript-ресурсов могут быть импортированы другими JavaScript-ресурсами или включены в модули QML.

Ресурс реализации кода-за-сценой

Большинство JavaScript-файлов, импортированных в документ QML, являются реализациями с состоянием для документа QML, который их импортирует. В этих случаях для корректной работы каждый экземпляр типа QML-объекта, определенного в документе, требует отдельной копии JavaScript-объектов и состояния.

По умолчанию при импорте JavaScript-файлов для каждого экземпляра QML-компонента создаётся уникальная изолированная копия. Если этот JavaScript-файл не импортирует ресурсы или модули с инструкцией .import, его код будет выполняться в том же контексте, что и экземпляр QML-компонента, и, следовательно, он может обращаться к объектам и свойствам, объявленным в этом QML-компоненте и манипулировать ими. В противном случае у него будет свой уникальный контекст, и объекты и свойства QML-компонента должны передаваться функциям JavaScript-файла в качестве параметров, если они необходимы.

Пример ресурса реализации кода-за-сценой:

// MyButton.qml
import QtQuick 2.0
import "my_button_impl.js" as Logic // A new instance of this JavaScript resource
                                    // is loaded for each instance of Button.qml.

Rectangle {
    id: rect
    width: 200
    height: 100
    color: "red"

    MouseArea {
        id: mousearea
        anchors.fill: parent
        onClicked: Logic.onClicked(rect)
    }
}
// my_button_impl.js
var clickCount = 0;   // this state is separate for each instance of MyButton
function onClicked(button) {
    clickCount += 1;
    if ((clickCount % 5) == 0) {
        button.color = Qt.rgba(1,0,0,1);
    } else {
        button.color = Qt.rgba(0,1,0,1);
    }
}

В общем случае, простую логику следует определять непосредственно в файле QML, но более сложная логика должна быть отделена в ресурсы реализации кода-за-сценой для обеспечения поддерживаемости и читаемости.

Общие JavaScript-ресурсы (библиотеки)

По умолчанию JavaScript-файлы, импортированные из QML, делят контекст с QML-компонентом. Это означает, что JavaScript-файлы имеют доступ к тем же QML-объектам и могут их изменять. В результате каждый импорт должен иметь уникальную копию этих файлов.

Предыдущий раздел описывает импорт JavaScript-файлов со статусом. Однако некоторые JavaScript-файлы являются бессостоятельными и действуют больше как переиспользуемые библиотеки, в том смысле, что они предоставляют набор вспомогательных функций, не требующих ничего из места, откуда они были импортированы. Вы можете значительно сэкономить память и ускорить создание экземпляров QML-компонентов, если вы помечаете такие библиотеки специальным пragma, как показано в следующем примере.

// factorial.js
.pragma library

var factorialCount = 0;

function factorial(a) {
    a = parseInt(a);

    // factorial recursion
    if (a > 0)
        return a * factorial(a - 1);

    // shared state
    factorialCount += 1;

    // recursion base-case.
    return 1;
}

function factorialCallCount() {
    return factorialCount;
}

Декларация pragma должна появляться перед любым JavaScript-кодом, за исключением комментариев.

Обратите внимание, что несколько QML-документов могут импортировать "factorial.js" и вызывать функции factorial и factorialCallCount, которые он предоставляет. Состояние JavaScript-импорта делится между QML-документами, которые его импортируют, и, следовательно, возвращаемое значение функции factorialCallCount может быть ненулевым при вызове в QML-документе, который никогда не вызывал функцию factorial.

Например:

// Calculator.qml
import QtQuick 2.0
import "factorial.js" as FactorialCalculator // This JavaScript resource is only
                                             // ever loaded once by the engine,
                                             // even if multiple instances of
                                             // Calculator.qml are created.

Text {
    width: 500
    height: 100
    property int input: 17
    text: "The factorial of " + input + " is: " + FactorialCalculator.factorial(input)
}

Поскольку они общие, файлы .pragma library не могут напрямую обращаться к объектам или свойствам экземпляра QML-компонента, хотя значения QML могут передаваться в качестве параметров функций.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qtqml-javascript-resources.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API