Михаиллл
July 15, 2019, 2:10 p.m.

Трудности с созданием ListView в QML

Добрый день.
Сделал несколько эллементов интерфейса.
Эти эллементы пытаюсь запихнуть в ListView интерфейс плывет, некоторые части не отображаются, а при нажатии снизу вверх ListView обновляется.
Скажите пожалуйста почему так? И как правильно добавлять в ListView? И можно ли Обойтись без ListView , просто размещая эллементы на основном окне, но так, что-бы была возможность их прогручивать?

  1. import QtQuick 2.12
  2. import QtQuick.Controls 2.12
  3.  
  4. Item {
  5. id: mainElement
  6. width: 400
  7. height: 700
  8.  
  9. ListView
  10. {
  11. id: listViewFerstWindow
  12. anchors.right: parent.right
  13. anchors.rightMargin: 0
  14. anchors.left: parent.left
  15. anchors.leftMargin: 0
  16. anchors.bottom: parent.bottom
  17. anchors.bottomMargin: 0
  18. anchors.top: parent.top
  19. anchors.topMargin: 0
  20. model: 1
  21.  
  22. delegate: Item
  23. {
  24. id: itemDelegateFirstWindow
  25.  
  26. Rectangle {
  27. id: rectangle
  28. height: 19
  29. color: "#e3ded3"
  30. anchors.right: parent.right
  31. anchors.rightMargin: 0
  32. anchors.left: parent.left
  33. anchors.leftMargin: 0
  34. anchors.top: parent.top
  35. anchors.topMargin: 0
  36.  
  37. Text {
  38. id: element1
  39. x: 78
  40. y: 4
  41. width: 214
  42. height: 14
  43. text: qsTr("8 (800) 700 0002 - отдел продаж")
  44. anchors.horizontalCenter: parent.horizontalCenter
  45. anchors.verticalCenter: parent.verticalCenter
  46. font.pixelSize: 12
  47. }
  48. }
  49.  
  50. Rectangle {
  51. id: rectangle1
  52. height: mainElement.height * 0.15
  53. color: "#ffffff"
  54. anchors.top: rectangle.bottom
  55. anchors.topMargin: 0
  56. anchors.right: parent.right
  57. anchors.rightMargin: 0
  58. anchors.left: parent.left
  59. anchors.leftMargin: 0
  60.  
  61. Image {
  62. id: imageLabel
  63. width: parent.width * 0.75
  64. anchors.left: parent.left
  65. anchors.leftMargin: 0
  66. anchors.bottom: parent.bottom
  67. anchors.bottomMargin: 0
  68. anchors.top: parent.top
  69. anchors.topMargin: 0
  70. fillMode: Image.PreserveAspectFit
  71. source: "qrc:/Images/Images/Xwd9C1BM5QA.jpg"
  72. }
  73.  
  74. Button {
  75. id: buttonMenu
  76. // x: 314
  77. // y: 37
  78. anchors.left: imageLabel.right
  79. anchors.right: parent.right
  80. width: parent.height * 0.5
  81. height: parent.height * 0.8
  82. text: qsTr("")
  83. anchors.rightMargin: parent.height * 0.2
  84. anchors.leftMargin: parent.height * 0.2
  85. anchors.verticalCenter: parent.verticalCenter
  86. background: Rectangle{
  87. color: "white"
  88. }
  89.  
  90. Image {
  91. id: image1
  92. anchors.fill: parent
  93. fillMode: Image.PreserveAspectFit
  94. source: "qrc:/Images/Images/menuRed.png"
  95. }
  96. }
  97. }
  98.  
  99. Rectangle {
  100. id: rectangle2
  101. x: 141
  102. y: 143
  103. width: 99
  104. height: 26
  105. color: "#db4c4c"
  106. radius: height * 0.3
  107.  
  108. MouseArea {
  109. id: mouseAreaRassrochka
  110. anchors.bottomMargin: 0
  111. anchors.fill: parent
  112.  
  113. Text {
  114. id: element2
  115. x: 82
  116. y: parent.height * 0.05
  117. //width: 5
  118. height: 7
  119. text: qsTr("Продаем")
  120. font.weight: Font.ExtraBold
  121. font.capitalization: Font.MixedCase
  122. font.family: "Times New Roman"
  123. elide: Text.ElideLeft
  124. color: "white"
  125. anchors.horizontalCenter: parent.horizontalCenter
  126. font.pixelSize: parent.height * 0.4
  127. }
  128.  
  129. Text {
  130. id: element3
  131. x: 87
  132. y: parent.height * 0.45
  133. text: qsTr("в рассрочку!")
  134. font.weight: Font.ExtraBold
  135. font.family: "Times New Roman"
  136. font.capitalization: Font.MixedCase
  137. color: "white"
  138. anchors.horizontalCenterOffset: 0
  139. anchors.horizontalCenter: parent.horizontalCenter
  140. font.pixelSize: parent.height * 0.4
  141. }
  142. }
  143. }
  144.  
  145. Rectangle{
  146. color: "red"
  147. width: 200
  148. height: 200
  149. y: 650
  150. }
  151.  
  152.  
  153. }
  154. }
  155.  
  156.  
  157.  
  158. }
  159.  
  160.  
5

Do you like it? Share on social networks!

13
Pavel K.
  • July 15, 2019, 2:29 p.m.
  • (edited)

например для селфиш ОС есть SilicaFlickable — самый базовый контейнер, который позволяет прокручивать экран
или обрати внимание на VerticalScrollDecorator {}
ну или вот https://doc.qt.io/qt-5.9/qtquickcontrols2-gallery-pages-scrollbarpage-qml.html
делает тоже самое что и SilicaFlickable

//Page {
// id: page

  1. SilicaFlickable {
  2.  
  3. }

// }

    Михаиллл
    • July 15, 2019, 2:36 p.m.

    У меня нет селфиш, есть виндовс, на худой конец есть макос и линукс. Но можно ли в виндовсе это сделать?

      Алексей Внуков
      • July 15, 2019, 2:38 p.m.

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

        Михаиллл
        • July 15, 2019, 2:44 p.m.

        Мне нужно что-бы було окно, которое прокручивается по вертикали (т.к. много эллементов интерфейса и они не влезают по вертикали в видимую часть экрана). В него ничего не нужно добавлять и убирать.

          Pavel K.
          • July 15, 2019, 2:46 p.m.
          • (edited)

          Скорее всего у вас модель не обьявлена, вот мой пример кода, но раз вам только скроллер нужен поместите все в контейнер Flickable {}

          1. model: modelVm.newList // newList возвращает список обьектов из плюсов
          2. delegate: Rectangle{
          3. width: parent.width
          4. height: childrenRect.height + Theme.paddingMedium * 1.5 // heith like children's
          5. color: "transparent"
          6. border{ color: "Orange"; width:4}
          7. Column{
          8. width: parent.width
          9. anchors.top: parent.top
          10. anchors.left: parent.left
          11. anchors.right: parent.right
          12. anchors.margins: Theme.paddingMedium
          13.  
          14. spacing: Theme.paddingMedium
          15. Label{
          16. width: parent.width
          17. text: "UserId: " + model.modelData.userId
          18. wrapMode: Text.WordWrap
          19. }
          20.  
          21. Label{
          22. width: parent.width
          23. text: "title: " + model.modelData.title
          24. wrapMode: Text.WordWrap
          25. }
          26. Label{
          27. width: parent.width
          28. text: "Body: " + model.modelData.body
          29. wrapMode: Text.WordWrap
          30. }
            R
            • July 15, 2019, 2:46 p.m.
            • (edited)

            важко розібратись у цьому вашому коді... так наперший погляд не варто писати

            1. id: listViewFerstWindow
            2. anchors.right: parent.right
            3. anchors.rightMargin: 0
            4. anchors.left: parent.left
            5. anchors.leftMargin: 0
            6. anchors.bottom: parent.bottom
            7. anchors.bottomMargin: 0
            8. anchors.top: parent.top
            9. anchors.topMargin: 0

            якщо ви хочите заповнити весь простір, достатньо anchors.fill: parent

            і ніде не додано розмір елемента
            delegate: Item
            {
            id: itemDelegateFirstWindow

            1. спробуйте дописати
            2. width: parent.width
            3. height: 100
              Михаиллл
              • July 15, 2019, 2:50 p.m.

              Спасибо, сделал так, размеры теперь не плывут. Но глюк с вырубанием экрана при перетаскиванем вверх остался.
              Скажите пожалуйста, из-за чего это может быть?

              1. ListView
              2. {
              3. id: listViewFerstWindow
              4. anchors.right: parent.right
              5. anchors.rightMargin: 0
              6. anchors.left: parent.left
              7. anchors.leftMargin: 0
              8. anchors.bottom: parent.bottom
              9. anchors.bottomMargin: 0
              10. anchors.top: parent.top
              11. anchors.topMargin: 0
              12. model: 1
              13.  
              14. delegate: Item
              15. {
              16. id: itemDelegateFirstWindow
              17. anchors.left: parent.left
              18. anchors.right: parent.right
              19. height: mainWindow1.height
                Михаиллл
                • July 15, 2019, 2:55 p.m.

                Может быть еще можно использовать ScrollView? Пробовал все поместить в ScrollView, но экран после этого не прокручивается.

                  Pavel K.
                  • July 15, 2019, 2:56 p.m.

                  советую заглянуть в офиц документацию по Qt https://doc.qt.io/qt-5.9/qtquickcontrols2-gallery-pages-scrollbarpage-qml.html
                  задайте фликабл контейнеру width: Theme.paddingLarge а hight : parent.heigh , где то намудрили скорее всего

                    Pavel K.
                    • July 15, 2019, 3:02 p.m.

                    https://doc.qt.io/qt-5/qml-qtquick-controls2-scrollview.html
                    читайте внимательнее )))
                    Примечание. ScrollView не обрезает содержимое автоматически. Если он не используется как полноэкранный элемент, вам следует установить для свойства clip значение true, как показано выше.
                    и там еще пример реализации всякой есть

                      Михаиллл
                      • July 15, 2019, 3:28 p.m.
                      • The answer was marked as a solution.

                      Вот такой вариант заработал

                      1. Flickable {
                      2. id: flickable
                      3. anchors.right: parent.right
                      4. anchors.rightMargin: 0
                      5. anchors.left: parent.left
                      6. anchors.leftMargin: 0
                      7. anchors.bottom: parent.bottom
                      8. anchors.bottomMargin: 0
                      9. anchors.top: parent.top
                      10. anchors.topMargin: 0
                      11. contentHeight: 2000
                        Алексей Внуков
                        • July 15, 2019, 4:07 p.m.

                        вопрос, а зачем вообще ListView если там будет только 1 элемент? и как говорилось выше, в данной ситуации, это не правильная запись

                        1. anchors.right: parent.right
                        2. anchors.rightMargin: 0
                        3. anchors.left: parent.left
                        4. anchors.leftMargin: 0
                        5. anchors.bottom: parent.bottom
                        6. anchors.bottomMargin: 0
                        7. anchors.top: parent.top
                        8. anchors.topMargin: 0
                        9. contentHeight: 2000

                        правильно будет написать

                        1. anchors.fill: parent
                          Михаиллл
                          • July 15, 2019, 5:24 p.m.

                          Спасибо. Просто программа мне автоматом такую запись выдает порой.

                            Comments

                            Only authorized users can post comments.
                            Please, Log in or Sign up
                            • Last comments
                            • AK
                              April 1, 2025, 11:41 a.m.
                              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                            • Evgenii Legotckoi
                              March 9, 2025, 9:02 p.m.
                              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                            • VP
                              March 9, 2025, 4:14 p.m.
                              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                            • ИМ
                              Nov. 22, 2024, 9:51 p.m.
                              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                            • Evgenii Legotckoi
                              Oct. 31, 2024, 11:37 p.m.
                              Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup