М
МаркГлен27 липня 2020 р. 07:35

Flow QML Type: связь с моделью, динамическое добавление и удаление элементов

views, QML, View, flow, view, model, qml, вёрстка qml, Model

Надо: подтягивать из с++ список слов, делать из них кнопки. Ширина кнопок соответствует ширине текста. При заполнении одной строки (ряда) - переход на следующую.

С передачей данных из с++, сигналами и слотами, вроде пока понятно. На данный момент затруднения с вёрсткой. ListView и GridView не подходят.

Подходит Flow QML Type, но с ним нельзя работать как с моделью-представлением. Или можно?

https://doc.qt.io/qt-5/qml-qtquick-flow.html

Как динамически добавлять-убирать элементы Flow?

И как применить свойства для каждого элемента Flow, как в данном случае это сделано для первого id: first_button

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Flow {
           id: flow_id
           anchors.top: parent.top
           anchors.horizontalCenter: parent.horizontalCenter
           anchors.margins: 4
           spacing: 10
           width: parent.width/1.5

           Button {
               id: first_button
               Text {
                   id: first_button_text
                   text: "Text"
                   font.pointSize: 15
                   anchors.horizontalCenter: parent.horizontalCenter
                   anchors.verticalCenter: parent.verticalCenter
                   verticalAlignment: Text.AlignVCenter
                   horizontalAlignment: Text.AlignHCenter
               }
               width: first_button_text.width + 12
           }
           Button { text: "items"; font.pointSize: 15 }
           Button { text: "flowing"; font.pointSize: 15 }
           Button { text: "inside"; font.pointSize: 15 }
           Button { text: "a"; font.pointSize: 15 }
           Button { text: "Flow"; font.pointSize: 15 }
           Button { text: "item"; font.pointSize: 15 }
       }


}

Как ещё можно было бы, я думаю: создать Row определённой ширины, добавлять в него кнопки и следить за суммой ширины кнопок, если ширина кнопок (с учётом margin конечно) на следующей итерации больше ширины Row то создавать следующий Row и так далее. Опять же, я не представляю как это сделать на практике. С model->view всё было как-то проще.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

3
Evgenii Legotckoi
  • 27 липня 2020 р. 08:31
  • (відредаговано)
  • Відповідь була позначена як рішення.

Полагаю, что нужно использовать Repeater. Он может формировать объекты из модели. Если добавлять и убирать объекты в модели, то по идее Repeater должен перестраивать объекты во flow.

Здесь уже обсуждался кейс, подобный вашему - ссылка на сообщение

    М
    • 27 липня 2020 р. 09:01

    Класс, похоже то что надо, спасибо.

      М
      • 27 липня 2020 р. 15:52

      Что-то не получалось, собирался задать вопрос, но вроде разобрался. Пока разбирался сделал кракозябру из кода по ссылке и кода из урока QML - Урок 007. ListView Qml . Не пропадать же добру, пусть будет.

      Пояснение: добавил к примеру ListView Qml --> Flow с Repeater'ом. Оба подсосаны к одной модели и в таком виде без ругани работают (пока что) как ожидается.

      А вопрос на котором споткнулся решился тем что в репитере text: model.text заменил на text: modelData

      qml_flow

      import QtQuick 2.12
      import QtQuick.Window 2.12
      import QtQuick.Controls 2.12
      
      Window {
          id: window
          visible: true
          width: 640
          height: 480
          title: qsTr("Hello World")
      
          // Number of Button used in text_button
          property int number_of_button: 0
      
          // Строка с полем где отображается индекс нажатой кнопки
          Row {
              id: row
              height: 50
              anchors.top: parent.top
              anchors.left: parent.left
              anchors.right: parent.right
      
              //Задаём размещение поля с индексом кнопки
              Rectangle {
                  width: ( parent.width / 5)
                  height: 50
      
                  // Установливаем текстовое поле для размещения индекса кнопки
                  Text {
                      id: textField_For_Button_Id
                      anchors.fill: parent
                      text: ""
                      verticalAlignment: Text.AlignVCenter
                      horizontalAlignment: Text.AlignHCenter
                  }
              }
      
              // Кнопка для создания динамических кнопок
              Button {
                  id: button_Creation
                  text: qsTr("Create Button")
                  width: (parent.width / 5) * 2
                  height: 50
      
      
                  // По клику на эту кнопку
                  // в модель
                  // добавляется объект
                  // с заданными параметрами
                  onClicked: {
                      model_id.append({property_Text_Of_New_Button: "Button " + ( ++number_of_button)})
                  }
              }
      
              // Кнопка для удаления динамических кнопок
              Button {
                  id: button_Deletion
                  text: qsTr("Delete Button")
                  width: (parent.width / 5) * 2
                  height: 50
      
                  // Удаляем кнопку по её индексу в ListView
                  onClicked: {
                      if(textField_For_Button_Id.text != "") {
                          model_id.remove(textField_For_Button_Id.text)
                          textField_For_Button_Id.text = ""
                      }
                  }
              }
          }
      
          // Наша модель, которая используется и для ListView
          // и для qml flow type
          ListModel {
              id: model_id
          }
      
          // ListView это список
          ListView {
              id: listView_id
              model: model_id // Модель прописана тут!
              anchors.top: row.bottom
              anchors.bottom: parent.bottom
              anchors.left: parent.left
              anchors.right: parent.right
      
              // Можно было прописать Item тут.
              // Вынесли в component и ссылаемся на его id.
              delegate: component_id
          }
      
          Component {
              // Вёрстка ОДНОГО объекта
              // который отображается в СПИСКЕ
              // в качестве одного ЭЛЕМЕНТА списка
              id: component_id
              Item {
                  id: item_id
                  anchors.left: parent.left
                  anchors.right: parent.right
                  height: 40
      
                  // в этом ЭЛЕМЕНТЕ будет одна кнопка
                  Button {
                      anchors.fill: parent
                      anchors.margins: 5
      
                      // _"самое интересное"_
                      // задаём свойству text переменную
                      text: property_Text_Of_New_Button
      
                      // по клику
                      // отдаём в текстовое поле
                      // ListView-индекс элемента
                      onClicked: {
                          textField_For_Button_Id.text = index
                      }
                  }
              }
          }
      
          Flow {
              anchors.bottom: parent.bottom
              anchors.horizontalCenter: parent.horizontalCenter
              anchors.margins: 4
              spacing: 10
      
              Repeater {
                  model: model_id
                  Rectangle {
                      width: textMetrics_id.tightBoundingRect.width + 20
                      height: textMetrics_id.tightBoundingRect.height + 10
                      color: "gray";
                      radius: 5;
                      Text {
                          id: currentText_id
                          anchors.centerIn: parent
                          text: modelData;
                      }
                      TextMetrics {
                          id:     textMetrics_id
                          font:   currentText_id.font
                          text:   currentText_id.text
                      }
                  }
              }
          }
      }
      

        Коментарі

        Only authorized users can post comments.
        Please, Log in or Sign up
        AD

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:50бали,
        • Рейтинг балів-4
        m
        • molni99
        • 26 жовтня 2024 р. 01:37

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:80бали,
        • Рейтинг балів4
        m
        • molni99
        • 26 жовтня 2024 р. 01:29

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:20бали,
        • Рейтинг балів-10
        Останні коментарі
        ИМ
        Игорь Максимов22 листопада 2024 р. 11:51
        Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii Legotckoi31 жовтня 2024 р. 14:37
        Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZE19 жовтня 2024 р. 08:19
        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов05 жовтня 2024 р. 07:51
        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas505 липня 2024 р. 11:02
        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Тепер обговоріть на форумі
        Evgenii Legotckoi
        Evgenii Legotckoi24 червня 2024 р. 15:11
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey115 листопада 2024 р. 06:04
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProject04 червня 2022 р. 03:49
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
        9
        9Anonim25 жовтня 2024 р. 09:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

        Слідкуйте за нами в соціальних мережах