М
Aug. 5, 2020, 8:58 p.m.

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

Do you like it? Share on social networks!

8
t
  • Aug. 5, 2020, 9:09 p.m.
  • (edited)
  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. }
    М
    • Aug. 5, 2020, 11:06 p.m.
    • (edited)

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

    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. }
      М
      • Aug. 6, 2020, 2:48 a.m.
      • (edited)

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

        t
        • Aug. 6, 2020, 3:33 a.m.
        1. onPressed: { bacgroundRectangle.color = 'red' }

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

          М
          • Aug. 6, 2020, 11:36 a.m.

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

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

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

          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
            • Aug. 6, 2020, 2:59 p.m.
            • (edited)
            • The answer was marked as a solution.
            1. Button{
            2. id: myButton
            3.  
            4. MouseArea {
            5. hoverEnabled: true
            6. onReleased: myButton.enabled = false
            7. }
            8. }

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

              М
              • Aug. 6, 2020, 3:49 p.m.

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

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

                М
                • Aug. 7, 2020, 1:37 a.m.

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

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

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

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

                  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