М
5 августа 2020 г. 20:58

QML: изменение стиля при наведении и при нажатии на кнопку

hover, containsMouse, mouseArea, onhover

Получается сделать либо одно либо другое, но не то и другое одновременно.
так работает: color: parent.pressed ? "violet" : "pink"
и так тоже: color: mouseArea.containsMouse ? "blue" : "magenta"

А вот так уже нет:

  1. if (parent.pressed)
  2. {
  3. color: "red"
  4. }
  5. else if (mouseArea.containsMouse)
  6. {
  7. color: "blue"
  8. }
  9. else
  10. {
  11. color: "green"
  12. }

Пробовал и по-другому писать условия, не получается.

qml hover press

Весь работающий (по отдельности) код:

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. import QtQuick.Controls 2.12
  4. import QtQuick.Layouts 1.12
  5.  
  6. Window {
  7. id: win
  8. visible: true
  9. width: 640
  10. height: 480
  11. title: qsTr("Hover and Press")
  12.  
  13. ColumnLayout {
  14. anchors.fill: parent
  15. spacing: 25
  16. Item {
  17. Layout.fillHeight: true
  18. }
  19. Button {
  20. Layout.alignment: Qt.AlignCenter
  21. implicitWidth: 200
  22. implicitHeight: 100
  23.  
  24.  
  25. background: Rectangle {
  26. border.width:5
  27. border.color: parent.pressed ? "pink" : "violet"
  28. color: parent.pressed ? "violet" : "pink"
  29. radius: width/4
  30.  
  31. Text {
  32. anchors.centerIn: parent
  33. font.pointSize: 16
  34. font.bold: true
  35. text: "PRESS"
  36. }
  37. }
  38. }
  39. Button {
  40. Layout.alignment: Qt.AlignCenter
  41. implicitWidth: 200
  42. implicitHeight: 100
  43. MouseArea {
  44. id: mouseArea
  45. anchors.fill: parent
  46. hoverEnabled: true
  47. }
  48.  
  49.  
  50. background: Rectangle {
  51. border.width:5
  52. border.color: mouseArea.containsMouse ? "magenta" : "blue"
  53. color: mouseArea.containsMouse ? "blue" : "magenta"
  54. radius: width/4
  55.  
  56. Text {
  57. anchors.centerIn: parent
  58. font.pointSize: 16
  59. font.bold: true
  60. text: "HOVER"
  61. }
  62. }
  63. }
  64. Item {
  65. Layout.fillHeight: true
  66. }
  67. }
  68. }
  69.  
2

Вам это нравится? Поделитесь в социальных сетях!

8
t
  • 5 августа 2020 г. 21:09
  • (ред.)
  1. if (parent.pressed)
  2. {
  3. return "red"
  4. }
  5. else if (mouseArea.containsMouse)
  6. {
  7. return "blue"
  8. }
  9. else
  10. {
  11. return "green"
  12. }
    М
    • 5 августа 2020 г. 23:06
    • (ред.)

    Да, с синтаксисом были проблемы, спасибо за подсказку. Правильно было бы так:

    1. color: if (parent.pressed)
    2. {
    3. return "red"
    4. }
    5. else if (mouseArea.containsMouse)
    6. {
    7. return "blue"
    8. }
    9. else
    10. {
    11. return "green"
    12. }

    И всё же так работает только наведение, на нажатие не рагирует. Попробовал так:

    1. color: if (parent.pressed)
    2. {
    3. return "red"
    4. }
    5. else if (mouseArea.containsMouse & !parent.pressed)
    6. {
    7. return "blue"
    8. }
    9. else
    10. {
    11. return "green"
    12. }

    То же самое.

    Добавил в MouseArea

    1. onPressed: { bacgroundRectangle.color = 'red' }

    Результат как с onClicked - один раз меняется цвет и больше не реагирует на события.
    Поэтому добавил onReleased - поведение оказалось не таким как предполагалось интуитивно, но меня устроит. После отжимания, кнопка приобретает указанный цвет и больше не реагирует на наведение. В моём случае это и не понадобится, а могло бы.

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

    1. import QtQuick 2.12
    2. import QtQuick.Window 2.12
    3. import QtQuick.Controls 2.12
    4. import QtQuick.Layouts 1.12
    5.  
    6. Window {
    7. id: win
    8. visible: true
    9. width: 640
    10. height: 480
    11. title: qsTr("Hover and Press")
    12.  
    13. ColumnLayout {
    14. anchors.fill: parent
    15. spacing: 25
    16. Item {
    17. Layout.fillHeight: true
    18. }
    19. Button {
    20. Layout.alignment: Qt.AlignCenter
    21. implicitWidth: 200
    22. implicitHeight: 100
    23.  
    24.  
    25. background: Rectangle {
    26. border.width:5
    27. border.color: parent.pressed ? "pink" : "violet"
    28. color: parent.pressed ? "violet" : "pink"
    29. radius: width/4
    30.  
    31. Text {
    32. anchors.centerIn: parent
    33. font.pointSize: 16
    34. font.bold: true
    35. text: "PRESS"
    36. }
    37. }
    38. }
    39. Button {
    40. Layout.alignment: Qt.AlignCenter
    41. implicitWidth: 200
    42. implicitHeight: 100
    43. MouseArea {
    44. id: mouseArea
    45. anchors.fill: parent
    46. hoverEnabled: true
    47. }
    48.  
    49.  
    50. background: Rectangle {
    51. border.width:5
    52. border.color: mouseArea.containsMouse ? "magenta" : "blue"
    53. color: mouseArea.containsMouse ? "blue" : "magenta"
    54. radius: width/4
    55.  
    56. Text {
    57. anchors.centerIn: parent
    58. font.pointSize: 16
    59. font.bold: true
    60. text: "HOVER"
    61. }
    62. }
    63. }
    64.  
    65. Button {
    66. Layout.alignment: Qt.AlignCenter
    67. implicitWidth: 200
    68. implicitHeight: 100
    69. hoverEnabled: true
    70.  
    71. MouseArea {
    72. id: mouseArea2
    73. anchors.fill: parent
    74. hoverEnabled: true
    75. onPressed: { bacgroundRectangle.color = 'red' }
    76. onReleased: { bacgroundRectangle.color = 'gray' }
    77. }
    78.  
    79. background: Rectangle {
    80. id: bacgroundRectangle
    81. border.width:5
    82. color: mouseArea2.containsMouse ? "blue" : "green"
    83. radius: width/4
    84.  
    85. Text {
    86. anchors.centerIn: parent
    87. font.pointSize: 16
    88. font.bold: true
    89. text: "HOVER & PUSH"
    90. }
    91. }
    92. }
    93. Item {
    94. Layout.fillHeight: true
    95. }
    96. }
    97. }
      М
      • 6 августа 2020 г. 2:48
      • (ред.)

      Читал доки. Узнал про сигналы entered, exited в MouseArea QML Type.
      С ним можно сделать то о чём спрашивал, хотя может это и не лучший способ.
      А вот не спросил бы - не стал бы читать доков наверное, не знаю почему так.

        t
        • 6 августа 2020 г. 3:33
        1. onPressed: { bacgroundRectangle.color = 'red' }

        Ломает биндинг, поэтому лучше не использовать.

          М
          • 6 августа 2020 г. 11:36

          Ломает биндинг

          Как раз как бы его теперь сломать, чтобы после отжимания кнопка становилась серой и больше ни на что не реагировала.

          Так работает превосходно, если бы только биндинг не нужно было сломать, как оказалось:

          1. Button {
          2. Layout.alignment: Qt.AlignCenter
          3. implicitWidth: 200
          4. implicitHeight: 100
          5. hoverEnabled: true
          6.  
          7. MouseArea {
          8. anchors.fill: parent
          9. hoverEnabled: true
          10. onPressed: { bacgroundRectangle.color = 'blue'
          11. console.log("pressed?", pressed)
          12. }
          13. onReleased: { bacgroundRectangle.color = 'yellow'
          14. console.log("released?", released)
          15. }
          16. onExited: { bacgroundRectangle.color = 'green'
          17. console.log("exited?", exited)
          18. }
          19. onEntered: { bacgroundRectangle.color = 'yellow'
          20. console.log("entered?", entered)
          21. }
          22. }
          23.  
          24. background: Rectangle {
          25. id: bacgroundRectangle
          26. border.width:5
          27. color: "green"
          28. radius: width/4
          29.  
          30. Text {
          31. anchors.centerIn: parent
          32. font.pointSize: 16
          33. font.bold: true
          34. text: "HOVER & PUSH"
          35. }
          36. }
          37. }
            U
            • 6 августа 2020 г. 14:59
            • (ред.)
            • Ответ был помечен как решение.
            1. Button{
            2. id: myButton
            3.  
            4. MouseArea {
            5. hoverEnabled: true
            6. onReleased: myButton.enabled = false
            7. }
            8. }

            Так кнопка перестанет быть активной и не будет ни на что реагировать)
            Ну там всякие anchors.fill: parent и тп - добавить по вкусу)

              М
              • 6 августа 2020 г. 15:49

              enabled = false
              перестанет быть активной и не будет ни на что реагировать)

              Хм.. по-моему пробовал такое. Проверю ещё раз после работы.

                М
                • 7 августа 2020 г. 1:37

                enabled = false
                перестанет быть активной и не будет ни на что реагировать)

                Хм.. по-моему пробовал такое. Проверю ещё раз после работы.

                Ура, спасибо большое! Работает.

                Всем спасибо за подсказки.

                  Комментарии

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