М
МаркГлен27 июля 2020 г. 7: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 г. 8:31
  • (ред.)
  • Ответ был помечен как решение.

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

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

    М
    • 27 июля 2020 г. 9: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
                      }
                  }
              }
          }
      }
      

        Комментарии

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

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

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

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

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

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

        • Результат:20баллов,
        • Очки рейтинга-10
        Последние комментарии
        i
        innorwall12 ноября 2024 г. 9:12
        Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
        i
        innorwall12 ноября 2024 г. 5:23
        QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
        i
        innorwall12 ноября 2024 г. 2:50
        Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
        i
        innorwall12 ноября 2024 г. 1:19
        Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
        i
        innorwall12 ноября 2024 г. 0:55
        PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
        Сейчас обсуждают на форуме
        i
        innorwall12 ноября 2024 г. 7:56
        добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
        i
        innorwall11 ноября 2024 г. 21:55
        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
        9
        9Anonim25 октября 2024 г. 19:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
        ИМ
        Игорь Максимов3 октября 2024 г. 14:05
        Реализация навигации по разделам Спасибо Евгений!

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