Михаиллл
6 июля 2019 г. 12:15

Как сделать цикл for в QML

Добрый день.
Как сделать цикл for в QML?
Вариант записи с++ не работает.
Так тоже не работает

  1. for ( i= 10 in 20)
3

Вам это нравится? Поделитесь в социальных сетях!

9
Andrei Yankovich
  • 6 июля 2019 г. 12:52

Если хочешь писать на qml учи javascript так как qml базируется на нем.
цикл for

  1. const array = [1,2,3]
  2. for (let i = 0; i < array.length; ++i) {
  3. console.log(array[i]);
  4. }
  5.  

цикл foreach

  1. const array = [1,2,3]
  2.  
  3. array.forEach(function(obj) {
  4. console.log(obj);
  5. });
    Andrei Yankovich
    • 6 июля 2019 г. 12:54
    • Ответ был помечен как решение.

    для qt постарше 5.12. (например 5.9)
    используй var в место let и const

      Михаиллл
      • 6 июля 2019 г. 13:09
      • (ред.)

      Сделал так, но не работает:

      1. for (let i= 10; i < 20; i++)

      Говорит:
      qrc:/main.qml:12 Unexpected token `for'

      qrc:/main.qml:12 Unexpected token `let'

      qrc:/main.qml:12 Expected token `,'

        Evgenii Legotckoi
        • 6 июля 2019 г. 15:17
        • (ред.)

        Покажите код main файла qml. Циклы в QML тоже нельзя пихать куда попало.

          Михаиллл
          • 6 июля 2019 г. 15:20

          Вот код

          1. import QtQuick 2.12
          2. import QtQuick.Window 2.12
          3. import QtLocation 5.12
          4. import QtPositioning 5.12
          5.  
          6. Window {
          7. visible: true
          8. width: 480
          9. height: 720
          10. title: qsTr("Map OSM")
          11.  
          12. for (var i = 0; i < 9; i++) {
          13. console.log(i)
          14. i++
          15. }
          16.  
          17. /* С помощью объекта Connections
          18. * Устанавливаем соединение с классом ядра приложения
          19. * */
          20. Connections
          21. {
          22. target: houseNumber // Указываем целевое соединение
          23. /* Объявляем и реализуем функцию, как параметр
          24. * объекта и с имененем похожим на название сигнала
          25. * Разница в том, что добавляем в начале on и далее пишем
          26. * с заглавной буквы
          27. * */
          28. /* onSendToQml: {
          29. labelCount.text = count // Устанавливаем счётчик в текстовый лейбл
          30. }*/
          31. }
          32.  
          33. Loader
          34. {
          35. id: loader
          36. anchors.fill: parent
          37. //source: "map.qml"
          38. }
          39. }
            Evgenii Legotckoi
            • 6 июля 2019 г. 15:27

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

            То есть ваш код не заработает в принципе.

            1. import QtQuick 2.12
            2. import QtQuick.Window 2.12
            3. import QtLocation 5.12
            4. import QtPositioning 5.12
            5.  
            6. Window {
            7. visible: true
            8. width: 480
            9. height: 720
            10. title: qsTr("Map OSM")
            11.  
            12. /* С помощью объекта Connections
            13. * Устанавливаем соединение с классом ядра приложения
            14. * */
            15. Connections
            16. {
            17. target: houseNumber // Указываем целевое соединение
            18. /* Объявляем и реализуем функцию, как параметр
            19. * объекта и с имененем похожим на название сигнала
            20. * Разница в том, что добавляем в начале on и далее пишем
            21. * с заглавной буквы
            22. * */
            23. /* onSendToQml: {
            24. labelCount.text = count // Устанавливаем счётчик в текстовый лейбл
            25. }*/
            26. }
            27.  
            28. Loader
            29. {
            30. id: loader
            31. anchors.fill: parent
            32. //source: "map.qml"
            33. }
            34.  
            35. Component.onCompleted: {
            36. for (var i = 0; i < 9; i++) {
            37. console.log(i)
            38. i++
            39. }
            40. }
            41. }

            Так заработает

              Михаиллл
              • 6 июля 2019 г. 15:35

              Спасибо, Заработало. Но почему так?

                Evgenii Legotckoi
                • 6 июля 2019 г. 15:43

                Потому, что QML имеет такие правила написания код. У него есть структура - это по сути расширенный JSON, документ. Поэтому он собственно и хорошо совместим с JavaScript, а также является интерпретируемым языком. Можно написать проект чисто на QML и запустить его в интерпретаторе, без сборки проекта.

                Структура QML такова, что достаточно вольным образом можно объявлять объекты, свойства и функции.

                Вот например корректный код на QML

                1. import QtQuick 2.12
                2. import QtQuick.Window 2.12
                3. import QtLocation 5.12
                4. import QtPositioning 5.12
                5.  
                6. Window {
                7. visible: true
                8. width: 480
                9. height: 720
                10. title: qsTr("Map OSM")
                11.  
                12. Connections
                13. {
                14. target: houseNumber // Указываем целевое соединение
                15. }
                16.  
                17. Loader
                18. {
                19. id: loader
                20. anchors.fill: parent
                21. }
                22.  
                23. Component.onCompleted: {
                24. for (var i = 0; i < 9; i++) {
                25. console.log(i)
                26. i++
                27. }
                28. }
                29.  
                30. function showI() {
                31. for (var i = 0; i < 9; i++) {
                32. console.log(i)
                33. i++
                34. }
                35. }
                36. }

                Здесь объявлены объекты

                • Window
                • Connections
                • Loader

                Свойства

                • width:
                • height:
                • title:

                Функции

                • function showI()

                Всё это представляет древовидную структуру и укладывается в декларативный стиль программирования.

                А ваш цикл - это уже из императивного программирования. И это может быть написано только внутри функций в qml файлах. То есть либо в обработчиках, либо в теле функций, который были объявлены, как например showI функция.

                  Михаиллл
                  • 6 июля 2019 г. 15:47

                  Ясно, спасибо за объяснение.

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь