July 6, 2019, 2: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
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

T
Dec. 11, 2019, 4:56 p.m.
Toma

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

  • Result:50points,
  • Rating points-4
AT
Dec. 10, 2019, 8:06 a.m.
Anastasija Troschenkova

C++ - Test 001. The first program and data types

  • Result:60points,
  • Rating points-1
AT
Dec. 10, 2019, 8:02 a.m.
Anastasija Troschenkova

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
Last comments
Dec. 9, 2019, 3:41 a.m.
Evgenij Legotskoj

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
NB
Dec. 9, 2019, 3:36 a.m.
Nikolaj Batmanov

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
Dec. 9, 2019, 3:14 a.m.
Evgenij Legotskoj

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
NB
Dec. 9, 2019, 3:05 a.m.
Nikolaj Batmanov

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
Dec. 8, 2019, 7:23 a.m.
Evgenij Legotskoj

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Now discuss on the forum
Dec. 12, 2019, 11:49 a.m.
qml_puthon_user

Да, с console.log() я разобрался, счётчик ничего не показывает
Dec. 12, 2019, 9:27 a.m.
Evgenij Legotskoj

Добрый день. Вообще Qt Designer это рисовалка формочек. Вы хотите от него больше, чем в нём есть. Максимум, что вы можете сделать, это накидать всю вёрстку в дизайнере, а потом привязыватьс…
MU
Dec. 11, 2019, 8:27 a.m.
Maciej Urmański

Thank you! Now works, and this is solution. num_embed = Embed.objects.filter(added_by=recipe.added_by).count()
Dec. 11, 2019, 8:12 a.m.
Mihailll

Так работает. Взял этот пример https://api-2d3d-cad.com/face_recognition_with_opencv/ void MainWindow::on_pushButton_4_clicked() //фото определение лица{ // Load Face cascade (.xml…
TD
Dec. 10, 2019, 4:14 a.m.
Timur Dosov

Спасибо, работает. А ещё вопрос: как загрузить страницу с динамической подгрузкой контента по скроллингу? Например - [https://ntvplus.ru/tv/]. Пока делаю через костыль - QApplication::s…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB