Evgenii Legotckoi
Қар. 9, 2015, 3:03 Т.Қ.

QML - 012-сабақ. TextInput-тен ListView-ге деректерді беру (үлгі/көрініс)

Работа с ListView в QML является довольно частым аспектом при разработке приложения под Android, поскольку очень многие приложения имеют в своём функционале построение списков с данными, записями, параметрами и т.д. Также это справедливо и при разработке приложений под Desktop на QML принцип будет аналогичен под обе платформы.

Для рассмотрения передачи информации в список предлагаю внимательно рассмотреть следующий вариант взаимодействия с ListView.

Принцип представления данных в ListView

Объект ListView имеет два важных свойства:

  1. delegate - который определяет внешний вид одного элемента в ListView
  2. model - в которую помещаются данные каждого элемента

В качестве модели представления данных можно использовать объект ListModel в котором содержатся данные для каждого элемента в списке. При этом данные присваиваются переменным, которые были присвоены определённым свойствам объектов в delegate. В ниже приведенном рисунке delegate имеет два объекта Text, свойствам text которых присвоены переменные text_first и text_second. Данные переменные определяют, куда буду подставляться данные из каждого ListElement в ListModel. Как видно из рисунка, каждый ListElement имеет два свойства, название которых идентично переменным, которые присвоены в delegate. По сути данные переменные являются ролями, по которым подставляются значения из ListModel. Таким образом получаем ListView с текстовыми полями, которые заполнены теми данными, которые были внесены в каждый ListElement в ListModel.


Работа с TextInput

Данные будут вводиться в поле TextInput и передаваться в ListView в качестве нового элемента. То есть, после того, как данные введены в TextInput, добавляем новый элемент в ListView записывая в него данные, которые внесены в TextInput. Событием, которое будет запускать передачу данных из TextInput в ListView будет служить нажатие клавиши Enter или клик по специальной кнопке Button, в обработчике которой также добавлен код для добавления элемента с данными из TextInput в ListView.

main.qml

В проекте созданном в Qt Creator редактируется только файл main.qml.

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. import QtQuick.Layouts 1.1
  4.  
  5. ApplicationWindow {
  6. visible: true
  7. width: 640
  8. height: 480
  9. title: qsTr("Hello World")
  10.  
  11. // Слой в котором располагается TextInput и Button
  12. RowLayout {
  13. id: rowLayout
  14. anchors.top: parent.top
  15. anchors.left: parent.left
  16. anchors.right: parent.right
  17. anchors.margins: 5
  18. height: 30
  19.  
  20. spacing: 5
  21. z:2 /* Уровень расположения слоёв элементов.
  22. * Элемент с z = 2 располагается выше, чем элемент с z = 1
  23. */
  24.  
  25. // Область с TextInput
  26. Rectangle {
  27. Layout.fillWidth: true
  28. Layout.fillHeight: true
  29. color: "white"
  30.  
  31. TextInput {
  32. id: textInput
  33. anchors.fill: parent
  34. horizontalAlignment: Text.AlignHCenter
  35. verticalAlignment: Text.AlignVCenter
  36.  
  37. /* По нажатию клавиши Enter передаём информацию
  38. * из TextInput в элемент ListView
  39. * */
  40. Keys.onPressed: {
  41. // 16777220 - код клавиши Enter
  42. if(event.key === 16777220){
  43. listModel.append({ textList: textInput.text })
  44. }
  45. }
  46. }
  47. }
  48.  
  49. /* Кнопка, по нажатию которой передаётся информация из
  50. * textInput в элемент ListView
  51. * */
  52. Button {
  53. id: button
  54. text: qsTr("добавить")
  55. Layout.fillHeight: true
  56.  
  57. onClicked: {
  58. listModel.append({ textList: textInput.text })
  59. }
  60. }
  61. }
  62.  
  63. // Список, в который добавляются элементы с данными из TextInput
  64. ListView {
  65. id: listView
  66.  
  67. anchors.top: rowLayout.bottom
  68. anchors.left: parent.left
  69. anchors.right: parent.right
  70. anchors.bottom: parent.bottom
  71. anchors.margins: 5
  72. z: 1 // Расположение ниже, чем слой с TextInput и Button
  73.  
  74. // Описание внешнего вида одного элемента в ListView
  75. delegate: Text {
  76. anchors.left: parent.left
  77. anchors.right: parent.right
  78. height: 50
  79. horizontalAlignment: Text.AlignHCenter
  80. verticalAlignment: Text.AlignVCenter
  81.  
  82. text: textList // Роль свойства text, в которую будут передаваться данные
  83. }
  84.  
  85. // Модель для представления данных в ListView
  86. model: ListModel {
  87. id: listModel
  88. }
  89. }
  90. }

Итог

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

Представленный алгоритм работы с ListView и TextInput справедлив и для других объектов вместо TextInput, таких как Button и т.д.

Получение данных из объектов, которые располагаются в ListElement в ListView аналогичен работе с кнопками в статье по динамическому созданию и удалению элементов в ListView .

Видеоурок

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз