July 6, 2019, 1:15 a.m.

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

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

for ( i= 10 in 20)
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
9

Если хочешь писать на 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);
});

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

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

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 `,'

Покажите код main файла 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")

        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"
        }
}

Туда нельзя цикл вставлять. Циклы и любую подобную логику можно вставлять только в функции в 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++
            }
        }
}

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

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

Потому, что 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 функция.

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

D
Aug. 16, 2019, 11:58 a.m.
Damir

C++ - Тест 003. Условия и циклы

  • Result:92points,
  • Rating points8
D
Aug. 16, 2019, 11:46 a.m.
Damir

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
u
Aug. 14, 2019, 1:55 p.m.
unrealproro

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
Aug. 19, 2019, 6:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
Aug. 18, 2019, 5:09 a.m.
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
Aug. 17, 2019, 8:04 a.m.
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 12:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 11:16 a.m.
Dmitrij

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 21, 2019, 2:16 a.m.
nayk1982

Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант: 1. Получить список таблиц через QSqlDatabase::tables 2. Для каждой табли…
Aug. 21, 2019, 12:31 a.m.
grig_p

Спасибо большое. Я долгое время писал на Object Pascal, привык, что там любое исключение, а не только сгенерированное самостоятельно, может быть перехвачено и обработано в блоках try. Дело …
Aug. 20, 2019, 1:10 p.m.
Mihailll

Нужно будет попробовать подставть другой тип данных, может заработае validator: IntValidator {bottom: 1; top: 99999999999}
Aug. 20, 2019, 12:37 p.m.
Aleksandr Panjushkin

Добрый день. Я бы хотел добавить, что в вашем коде можно было бы использовать слово auto и цикл for с перебором. Так код получился бы компактнее: auto map = new QMap<Qstring, QString&…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB