JavaScript в QML

Добавлено 18 мая 2022 в 23:29

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

Подсказка

В сообществе Qt вопрос о правильном сочетании QML/JS/Qt C++ в современном приложении Qt открыт. Общепринятая рекомендуемая комбинация состоит в том, чтобы ограничить JS-часть вашего приложения до минимума и выполнять бизнес-логику внутри Qt C++, а логику пользовательского интерфейса – внутри QML/JS.

Эта книга раздвигает границы, что не всегда является правильным сочетанием для разработки продукта и не для всех. Важно следить за своими командными навыками и своим личным вкусом. В случае сомнений следуйте рекомендации, приведенной выше.

Вот краткий пример того, как выглядит JS, используемый в QML:

Button {
  width: 200
  height: 300
  property bool checked: false
  text: "Click to toggle"

  // JS функция
  function doToggle() {
    checked = !checked
  }

  onClicked: {
    // это тоже JavaScript
    doToggle();
    console.log('checked: ' + checked)
  }
}

Таким образом, JavaScript может появляться во многих местах внутри QML как отдельная функция JS, как модуль JS, и он может быть на правой стороне каждой привязки свойства.

import "util.js" as Util // импорт чистого модуля JS

Button {
  width: 200
  height: width*2 // JS справа в привязке свойства

  // отдельная функция (не совсем полезная)
  function log(msg) {
    console.log("Button> " + msg);
  }

  onClicked: {
    // это JavaScript
    log();
    Qt.quit();
  }
}

В QML вы объявляете пользовательский интерфейс, а в JavaScript вы делаете его функциональным. Итак, сколько кода на JavaScript вы должны написать? Это зависит от вашего стиля и того, насколько вы знакомы с разработкой JS. JS – это язык со слабой типизацией, что затрудняет обнаружение дефектов типов. Кроме того, функции ожидают все варианты аргументов, что может быть очень неприятной ошибкой. Способ обнаружения дефектов – тщательное модульное тестирование или приемочное тестирование. Поэтому, если вы разрабатываете в JS настоящую логику (а не какие-то связующие строки кода), вам следует начать использовать подход «сначала тесты». Обычно смешанные команды (Qt/C++ и QML/JS) очень успешны, когда они минимизируют количество JS во внешнем интерфейсе в качестве бизнес-логики и выполняют тяжелую работу на Qt C++ в бэкэнде. Затем серверная часть должна пройти тщательное модульное тестирование, чтобы разработчики внешнего интерфейса могли доверять коду и сосредоточиться на всех оставшихся небольших требованиях к пользовательскому интерфейсу.

Подсказка

В целом: бэкенд-разработчики ориентируются на функциональность, а фронтенд-разработчики – на пользовательских историях.

Теги

GUI / Графический интерфейс пользователяJavaScriptQMLQtQtQuickПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.