М
МаркГленAug. 5, 2020, 10:58 a.m.

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

hover, containsMouse, mouseArea, onhover

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

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

if (parent.pressed)
{
   color: "red"
}
else if (mouseArea.containsMouse)
{
   color: "blue"
}
else
{
   color: "green"
}

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

qml hover press

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

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12

Window {
    id: win
    visible: true
    width: 640
    height: 480
    title: qsTr("Hover and Press")

    ColumnLayout {
        anchors.fill: parent
        spacing: 25
        Item {
            Layout.fillHeight: true
        }
        Button {
            Layout.alignment: Qt.AlignCenter
            implicitWidth: 200
            implicitHeight: 100


            background: Rectangle {
                border.width:5
                border.color: parent.pressed ? "pink" : "violet"
                color: parent.pressed ? "violet" : "pink"
                radius: width/4

            Text {
                anchors.centerIn: parent
                font.pointSize: 16
                font.bold: true
                text: "PRESS"
            }
          }
        }
        Button {
            Layout.alignment: Qt.AlignCenter
            implicitWidth: 200
            implicitHeight: 100
            MouseArea {
                id: mouseArea
                anchors.fill: parent
                hoverEnabled: true
            }


            background: Rectangle {
                border.width:5
                border.color: mouseArea.containsMouse ? "magenta" : "blue"
                color: mouseArea.containsMouse ? "blue" : "magenta"
                radius: width/4

            Text {
                anchors.centerIn: parent
                font.pointSize: 16
                font.bold: true
                text: "HOVER"
            }
          }
        }
        Item {
            Layout.fillHeight: true
        }
    }
}

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

8
t
  • Aug. 5, 2020, 11:09 a.m.
  • (edited)
if (parent.pressed)
{
   return "red"
}
else if (mouseArea.containsMouse)
{
   return "blue"
}
else
{
   return "green"
}
    М
    • Aug. 5, 2020, 1:06 p.m.
    • (edited)

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

    color: if (parent.pressed)
    {
       return "red"
    }
    else if (mouseArea.containsMouse)
    {
       return "blue"
    }
    else
    {
       return "green"
    }
    

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

    color: if (parent.pressed)
    {
       return "red"
    }
    else if (mouseArea.containsMouse & !parent.pressed)
    {
       return "blue"
    }
    else
    {
       return "green"
    }
    

    То же самое.

    Добавил в MouseArea

    onPressed: { bacgroundRectangle.color = 'red' }
    

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

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

    import QtQuick 2.12
    import QtQuick.Window 2.12
    import QtQuick.Controls 2.12
    import QtQuick.Layouts 1.12
    
    Window {
        id: win
        visible: true
        width: 640
        height: 480
        title: qsTr("Hover and Press")
    
        ColumnLayout {
            anchors.fill: parent
            spacing: 25
            Item {
                Layout.fillHeight: true
            }
            Button {
                Layout.alignment: Qt.AlignCenter
                implicitWidth: 200
                implicitHeight: 100
    
    
                background: Rectangle {
                    border.width:5
                    border.color: parent.pressed ? "pink" : "violet"
                    color: parent.pressed ? "violet" : "pink"
                    radius: width/4
    
                Text {
                    anchors.centerIn: parent
                    font.pointSize: 16
                    font.bold: true
                    text: "PRESS"
                }
              }
            }
            Button {
                Layout.alignment: Qt.AlignCenter
                implicitWidth: 200
                implicitHeight: 100
                MouseArea {
                    id: mouseArea
                    anchors.fill: parent
                    hoverEnabled: true
                }
    
    
                background: Rectangle {
                    border.width:5
                    border.color: mouseArea.containsMouse ? "magenta" : "blue"
                    color: mouseArea.containsMouse ? "blue" : "magenta"
                    radius: width/4
    
                Text {
                    anchors.centerIn: parent
                    font.pointSize: 16
                    font.bold: true
                    text: "HOVER"
                }
              }
            }
    
            Button {
                Layout.alignment: Qt.AlignCenter
                implicitWidth: 200
                implicitHeight: 100
                hoverEnabled: true
    
                MouseArea {
                    id: mouseArea2
                    anchors.fill: parent
                    hoverEnabled: true
                    onPressed: { bacgroundRectangle.color = 'red' }
                    onReleased: { bacgroundRectangle.color = 'gray' }
                }
    
                background: Rectangle {
                    id: bacgroundRectangle
                    border.width:5
                    color: mouseArea2.containsMouse ? "blue" : "green"
                    radius: width/4
    
                Text {
                    anchors.centerIn: parent
                    font.pointSize: 16
                    font.bold: true
                    text: "HOVER & PUSH"
                }
              }
            }
            Item {
                Layout.fillHeight: true
            }
        }
    }
    
      М
      • Aug. 5, 2020, 4:48 p.m.
      • (edited)

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

        t
        • Aug. 5, 2020, 5:33 p.m.
        onPressed: { bacgroundRectangle.color = 'red' }
        

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

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

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

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

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

          Button {
                      Layout.alignment: Qt.AlignCenter
                      implicitWidth: 200
                      implicitHeight: 100
                      hoverEnabled: true
          
                      MouseArea {
                          anchors.fill: parent
                          hoverEnabled: true
                          onPressed: { bacgroundRectangle.color = 'blue'
                          console.log("pressed?", pressed)
                          }
                          onReleased: { bacgroundRectangle.color = 'yellow'
                              console.log("released?", released)
                          }
                          onExited: { bacgroundRectangle.color = 'green'
                              console.log("exited?", exited)
                          }
                          onEntered: { bacgroundRectangle.color = 'yellow'
                              console.log("entered?", entered)
                          }
                      }
          
                      background: Rectangle {
                          id: bacgroundRectangle
                          border.width:5
                          color: "green"
                          radius: width/4
          
                      Text {
                          anchors.centerIn: parent
                          font.pointSize: 16
                          font.bold: true
                          text: "HOVER & PUSH"
                      }
                    }
                  }
          
            U
            • Aug. 6, 2020, 4:59 a.m.
            • (edited)
            • The answer was marked as a solution.
            Button{
                id: myButton
            
                MouseArea {
                    hoverEnabled: true
                    onReleased: myButton.enabled = false        
                }
            }
            

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

              М
              • Aug. 6, 2020, 5:49 a.m.

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

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

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

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

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

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

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

                  Comments

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  e
                  • ehot
                  • March 31, 2024, 9:29 p.m.

                  C++ - Тест 003. Условия и циклы

                  • Result:78points,
                  • Rating points2
                  B

                  C++ - Test 002. Constants

                  • Result:16points,
                  • Rating points-10
                  B

                  C++ - Test 001. The first program and data types

                  • Result:46points,
                  • Rating points-6
                  Last comments
                  k
                  kmssrFeb. 9, 2024, 2:43 a.m.
                  Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  EVA
                  EVADec. 25, 2023, 6:30 p.m.
                  Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                  J
                  JonnyJoDec. 25, 2023, 4:38 p.m.
                  Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                  G
                  GvozdikDec. 19, 2023, 5:01 a.m.
                  Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                  Now discuss on the forum
                  a
                  a_vlasovApril 14, 2024, 1:41 p.m.
                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                  Павел Дорофеев
                  Павел ДорофеевApril 14, 2024, 9:35 a.m.
                  QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                  f
                  fastrexApril 4, 2024, 11:47 a.m.
                  Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                  AC
                  Alexandru CodreanuJan. 19, 2024, 7:57 p.m.
                  QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                  Follow us in social networks