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

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

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

for ( i= 10 in 20)
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

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

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

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

цикл foreach

const array = [1,2,3]

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

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

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

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

      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

          Вот код

          import QtQuick 2.12
          import QtQuick.Window 2.12
          import QtLocation 5.12
          import QtPositioning 5.12
          
          Window {
              visible: true
                  width: 480
                  height: 720
                  title: qsTr("Map OSM")
          
                  for (var i = 0; i < 9; i++)  {
                      console.log(i)
                      i++
                  }
          
                  /* С помощью объекта Connections
                    * Устанавливаем соединение с классом ядра приложения
                    * */
                   Connections
                   {
                       target: houseNumber // Указываем целевое соединение
                       /* Объявляем и реализуем функцию, как параметр
                        * объекта и с имененем похожим на название сигнала
                        * Разница в том, что добавляем в начале on и далее пишем
                        * с заглавной буквы
                        * */
                      /* onSendToQml: {
                           labelCount.text = count // Устанавливаем счётчик в текстовый лейбл
                       }*/
                   }
          
                  Loader
                  {
                      id: loader
                      anchors.fill: parent
                      //source: "map.qml"
                  }
          }
          
            Evgenii Legotckoi
            • 6 июля 2019 г. 15:27

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

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

            import QtQuick 2.12
            import QtQuick.Window 2.12
            import QtLocation 5.12
            import QtPositioning 5.12
            
            Window {
                visible: true
                    width: 480
                    height: 720
                    title: qsTr("Map OSM")
            
                    /* С помощью объекта Connections
                      * Устанавливаем соединение с классом ядра приложения
                      * */
                     Connections
                     {
                         target: houseNumber // Указываем целевое соединение
                         /* Объявляем и реализуем функцию, как параметр
                          * объекта и с имененем похожим на название сигнала
                          * Разница в том, что добавляем в начале on и далее пишем
                          * с заглавной буквы
                          * */
                        /* onSendToQml: {
                             labelCount.text = count // Устанавливаем счётчик в текстовый лейбл
                         }*/
                     }
            
                    Loader
                    {
                        id: loader
                        anchors.fill: parent
                        //source: "map.qml"
                    }
            
                    Component.onCompleted: {
                        for (var i = 0; i < 9; i++)  {
                            console.log(i)
                            i++
                        }
                    }
            }
            

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

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

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

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

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

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

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

                import QtQuick 2.12
                import QtQuick.Window 2.12
                import QtLocation 5.12
                import QtPositioning 5.12
                
                Window {
                    visible: true
                        width: 480
                        height: 720
                        title: qsTr("Map OSM")
                
                         Connections
                         {
                             target: houseNumber // Указываем целевое соединение
                         }
                
                        Loader
                        {
                            id: loader
                            anchors.fill: parent
                        }
                
                        Component.onCompleted: {
                            for (var i = 0; i < 9; i++)  {
                                console.log(i)
                                i++
                            }
                        }
                
                        function showI() {
                            for (var i = 0; i < 9; i++)  {
                                console.log(i)
                                i++
                            }
                        }
                }
                

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

                • Window
                • Connections
                • Loader

                Свойства

                • width:
                • height:
                • title:

                Функции

                • function showI()

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

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

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

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

                    Комментарии

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

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:84баллов,
                    • Очки рейтинга4
                    Ua

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:42баллов,
                    • Очки рейтинга-8
                    ОК

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:47баллов,
                    • Очки рейтинга-6
                    Последние комментарии
                    ИМ
                    Игорь Максимов22 ноября 2024 г. 21:51
                    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii Legotckoi31 октября 2024 г. 23:37
                    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZE19 октября 2024 г. 17:19
                    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов5 октября 2024 г. 16:51
                    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas55 июля 2024 г. 20:02
                    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Сейчас обсуждают на форуме
                    f
                    firstlunoxod15 февраля 2025 г. 13:46
                    Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                    Дмитрий
                    Дмитрий3 февраля 2025 г. 16:24
                    Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                    NW
                    Nayo Wai30 января 2025 г. 19:22
                    не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                    n
                    nkly3 января 2025 г. 12:52
                    Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                    M
                    Marsel17 августа 2023 г. 0:26
                    OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                    Следите за нами в социальных сетях