JS / Ecmascript w QtQuick.

Od lat krążę wokół tematu ale trafiłem ostatnio na fajną książkę o ES6 (Learning JS z O’Reilly’ego) i sporo rzeczy w tej wersji standardu mi się podoba. Na tyle to fajne, że postanowiłem trochę poeksperymentować. Nieprzypadkowo akurat z ES6, bo Qt5.12 ma obsługiwać Ecmascript w wersji 6-tej. Fajne toto i szybkie, a z Qt nie musi być przywiązane do backendu, czy przeglądarki:

import QtQuick 2.11
import QtQuick.Window 2.11

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("JS fun 2")

    Rectangle {
        id: rect
        width: parent.width-100; height: parent.height-100
        border.color: 'red'
        border.width: 10
        anchors.centerIn: parent

        function get_fibo(n) {
            function fibo(n) {
                if (n < 1)
                    return 0;
                if (n <= 2)
                    return 1;
               return fibo(n-1) + fibo(n-2);
            }
            var ret = '';
            for (var i=0; i<n; i++)
                ret += fibo(i) + ' ';
            return ret;
        }

        Text {
            text: parent.get_fibo(15)
            anchors.centerIn: parent
        }
    }
}
fib_js
JS w QML nie wymaga magicznych sztuczek. Można go sobie ot tak używać, jak widać w powyższym przykładzie.
Nieco dziwny jest scoping w QML, bo jeśli obiekt który wywołujemy znajduje się w obiekcie nadrzędnym, trzeba się do niego dostać np. przez parent albo id. Jeśli nie, trzeba obiekt, np. funkcję wrzucić do obiektu najgłówniejszego ;). Może ma to jakieś głębsze uzasadnienie, a może to się zmieni w implementacji ES6.