BlinCT
Feb. 6, 2021, 2:31 a.m.

Применение нужных настроек(цвет, ширина) в графике для определенных обьектов

Всем привет.
Пытаюсь решить такую проблему:
есть булевое значение наличия или отсутствия заголовков в таблице, так же для строк в таблице через 1 строку применяется дизайн.
Я вызываю функцию и передаю туда индекс, там и происходит те или иные указания для цвета и ширины границы.
И ошибку я получаю
ReferenceError: delegateRect is not defined
Вопрос, что я делаю не так?)
Благодарю заранее

  1. import QtQuick 2.12
  2.  
  3. Item
  4. {
  5. id: root
  6.  
  7. property var model
  8. property bool headers : false
  9.  
  10. function getSize(column)
  11. {
  12. return tableView.model.getSizeLongString(column)
  13. }
  14.  
  15. function foo(indexRow)
  16. {
  17. if (headers == true)
  18. {
  19. console.log("indexRow", headers)
  20. if (indexRow % 2 == 0)
  21. {
  22. delegateRect.color = "transparent";
  23. delegateRect.border.width = 0;
  24. }
  25. else
  26. {
  27. delegateRect.color = "#2C3033";
  28. delegateRect.border.width = 1;
  29. }
  30. }
  31. else
  32. {
  33. console.log("indexRow", headers)
  34. if (indexRow % 2 != 0)
  35. {
  36. delegateRect.color = "transparent";
  37. delegateRect.border.width = 0;
  38. }
  39. else
  40. {
  41. delegateRect.color = "#2C3033";
  42. delegateRect.border.width = 1;
  43. }
  44. }
  45. }
  46.  
  47. Row
  48. {
  49. id: rowHeader
  50.  
  51. anchors.top: parent.top
  52. anchors.left: parent.left
  53. anchors.right: parent.right
  54. height: visible ? 35 : 0
  55. visible: root.headers
  56. enabled: !root.headers
  57.  
  58. Repeater
  59. {
  60. id: headerRepeater
  61.  
  62. model: root.model.headerModel
  63.  
  64. Rectangle
  65. {
  66. id: rectHeader
  67.  
  68. width: root.model.getSizeLongString(index)
  69. border.color: "blue"
  70. height: 35
  71.  
  72. Component.onCompleted:
  73. {
  74. root.model.setHeaderItem(rectHeader);
  75. }
  76.  
  77. Text
  78. {
  79. width: 50
  80.  
  81. height: 35
  82.  
  83. anchors.fill: parent
  84.  
  85. text: root.model.headerData(modelData, Qt.Horizontal, "display")
  86. }
  87. }
  88. }
  89. }
  90.  
  91. ListView
  92. {
  93. id: tableView
  94.  
  95. anchors.top: headers ? rowHeader.bottom : root.top
  96. anchors.left: parent.left
  97. anchors.right: parent.right
  98. anchors.bottom: parent.bottom
  99.  
  100. flickableDirection: TableView.VerticalFlick
  101.  
  102. clip: true
  103. model: root.model
  104.  
  105. delegate: Rectangle
  106. {
  107. id: delegateRect
  108.  
  109. color: "transparent"
  110. implicitWidth: 543
  111. implicitHeight: 22
  112.  
  113. property var indexRow: model.index
  114.  
  115. Row
  116. {
  117. id: rect
  118. clip: true
  119.  
  120. Repeater
  121. {
  122. id: celsRepeater
  123.  
  124. model: root.model.columnCount()
  125.  
  126.  
  127. Component.onCompleted:
  128. {
  129. root.foo(delegateRect.indexRow)
  130. }
  131.  
  132. Rectangle
  133. {
  134. id: rextText
  135.  
  136. border.color: "blue"
  137. color: "#2C3033"
  138. width: root.model.getSizeLongString(index)
  139. height: 15
  140.  
  141. Text
  142. {
  143. width: 50
  144. height: 35
  145.  
  146. anchors.fill: parent
  147. font.pixelSize: 12
  148. verticalAlignment: Text.AlignTop
  149. color: model.index === 0 ? "#B8B8B8" : "#EAEAEA"
  150. text: root.model.getData(indexRow, model.index)
  151. }
  152. }
  153. }
  154. }
  155. }
  156. }
  157. }
  158.  
2

Do you like it? Share on social networks!

7
Алексей Внуков
  • Feb. 8, 2021, 4:01 p.m.

добрый, а пробывали обращаться через лист tableView.delegateRect.color="transparent";?
когда-то делал цветные строки в таблице на первых контролах, делал так

  1. TableView
  2. {
  3. id: table_view_monitor
  4. anchors.fill: parent
  5.  
  6. clip: true
  7.  
  8. TableViewColumn
  9. {
  10. role: "InOutState"
  11. title: qsTr("Direction")
  12. width: 125
  13. delegate: Label
  14. {
  15. text:
  16. {
  17. var al=styleData.value//monitorModel.get(styleData.row).inoutstate
  18. if (al===0) return qsTr('enter')
  19. else if(al===1) return qsTr('exit')
  20. else return qsTr('undefined')
  21. }
  22. color: "black"
  23. font.family: "Arial"
  24. font.pixelSize: 11
  25. leftPadding: 5
  26. }
  27. }
  28.  
  29. TableViewColumn
  30. {
  31. role: "norm"
  32. title: qsTr("NORM")
  33. visible: false
  34. width: 200
  35. delegate: Label
  36. {
  37. text: styleData.value
  38. color: "black"
  39. font.family: "Arial"
  40. font.pixelSize: 11
  41. bottomPadding: 2
  42. leftPadding: 5
  43. }
  44. }
  45. model: m_model
  46.  
  47. headerDelegate: Rectangle {
  48. height: 25
  49. width: textItem.implicitWidth
  50.  
  51. Label {
  52. id: textItem
  53. anchors.centerIn: parent
  54. text: styleData.value
  55. color: "black"
  56. font.family: "Arial"
  57. font.pixelSize: 12
  58. }
  59. Frame {
  60. anchors.right: parent.right
  61. anchors.top: parent.top
  62. anchors.bottom: parent.bottom
  63. anchors.bottomMargin: 1
  64. anchors.topMargin: 1
  65. width: 1
  66. }
  67. }
  68.  
  69. rowDelegate: Rectangle
  70. {
  71. anchors.fill: parent
  72. color:{
  73. var al=m_model.get(styleData.row).norm
  74. if(al===0) return "red"
  75. else if (styleData.selected) return 'lightblue'
  76. else if(styleData.alternate) return Material.background
  77. else return "white"
  78. }
  79.  
  80. MouseArea
  81. {
  82.  
  83. anchors.fill: parent
  84. acceptedButtons: Qt.RightButton | Qt.LeftButton
  85. onClicked:
  86. {
  87. table_view_monitor.selection.clear()
  88. table_view_monitor.selection.select(styleData.row)
  89. table_view_monitor.currentRow=styleData.row
  90. table_view_monitor.focus=true
  91.  
  92. switch(mouse.button)
  93. {
  94. case Qt.RightButton:
  95. contextMenu.popup()
  96. break
  97. default:
  98. break
  99. }
  100. }
  101. }
  102. Menu
  103. {
  104. id: contextMenu
  105. MenuItem
  106. {
  107. text: qsTr("Get CardNo")
  108. onTriggered:
  109. {
  110. card_no.text=m_model.get(styleData.row).CardNo
  111. table_view_monitor.focus=false
  112. }
  113. }
  114. }
  115. }
  116. }
    BlinCT
    • Feb. 8, 2021, 5:51 p.m.

    Интересно что если я не вызываю функцию а в место нее все if вытаскиваю то это срабатывает. Но через функцию не работает.
    Не пойму почему

      Алексей Внуков
      • Feb. 8, 2021, 7:23 p.m.

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

        Алексей Внуков
        • Feb. 8, 2021, 7:23 p.m.

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

          BlinCT
          • Feb. 9, 2021, 6:26 p.m.

          На самом деле есть такая мысль, надо бы понять как это протестить чтоыб найти ответ)
          Кстати такой вопрос который касается имено этого кода, на строке 138 там есть ширина для Rectangle и в нем уже будет текст.
          А вот внешнйи делегат у него у Rectangle у меня стоит статический размер ширины.
          Вопрос состоит в том, можно ли получая ширину на 138 формировать ширину делегата для всех созданных в репиторе обьектов?
          Мне надо как то в нормальный вид привезти то что на 110 и 111 строках.

            Алексей Внуков
            • Feb. 10, 2021, 4:05 a.m.
            • (edited)

            если я правильно понял, можно добавить property int rec_width:0 в самом начале делегата, тогда там где нужно указать ширину указываем rec_width, а в Component.onCompleted: добавить rec_width=root.model.getSizeLongString(index), тогда будет перерисовываться по указанному размеру (должно сработать), или отдельно в модели передавать ширину, тогда будет что-то вроде property int rec_width:root.model.getSize(). возможно путанно написал, надеюсь идею поняли

              BlinCT
              • Feb. 12, 2021, 5:10 a.m.

              Добрый вечер.
              Спасибо за совет. По сути я идею понял но она получается не рабочей.
              Потому что с начале у делегата имеется пропертя данная, потом ширина implicitWidth: 543 которая и дает ширину данной строки, а уже после репитер создает данные 2 или более ячеек, и только тогда пропертя получает размер.
              В общем не получается так(

                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