Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Button with MouseArea property and animation
Forum Updated to NodeBB v4.3 + New Features

Button with MouseArea property and animation

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
16 Posts 4 Posters 1.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Ivelin

    @Ronel_qtmaster, is there some way to keep them ? Or maybe a way for me to implement them?

    B Offline
    B Offline
    Bob64
    wrote on last edited by
    #7

    @Ivelin you are going to have to explain exactly what it is you are trying to do. I have already answered you about onClicked and you appear to have ignored what I said. Let me know if you did not understand.

    I 2 Replies Last reply
    1
    • B Bob64

      @Ivelin you are going to have to explain exactly what it is you are trying to do. I have already answered you about onClicked and you appear to have ignored what I said. Let me know if you did not understand.

      I Offline
      I Offline
      Ivelin
      wrote on last edited by Ivelin
      #8

      @Bob64, hello

      Sorry for the misunderstanding

      I made your answer marked as a solution, but I just realized that it is not working as I expected.

      Let me try again.

      I want to have a button and I want to do stuff on click, but when I use the onClicked proeprty that is built-in in the qml component it removes the default button animation. It removes it with MouseArea onClicked as well.

      By animation I mean the effect that happens after clicking the button.

      How can I have the onClicked property as well as the animation ?

      Could you please clear my thoughts here?

      B 1 Reply Last reply
      0
      • I Ivelin has marked this topic as solved on
      • I Ivelin marked this topic as a regular topic on
      • I Ivelin marked this topic as a question on
      • I Ivelin has marked this topic as solved on
      • I Ivelin has marked this topic as unsolved on
      • B Bob64

        @Ivelin you are going to have to explain exactly what it is you are trying to do. I have already answered you about onClicked and you appear to have ignored what I said. Let me know if you did not understand.

        I Offline
        I Offline
        Ivelin
        wrote on last edited by
        #9

        @Bob64

        In my current scenario I have a custom button:

        Button {
            id:control1
          
            implicitWidth: 46
            implicitHeight: 46
        
            property real radius: 8
            property color backgroundColor: "#14A44D"
            property string setIcon: ""
            property color textColor: "#FFFFFF"
        
            property real borderWidth: 0
            property color borderColor: "transparent"
            font.pixelSize: FontStyle.h3
            font.family: FontStyle.getContentFont.name
            font.bold: Font.Bold
            font.weight: Font.Bold
        
            signal clicked
        
            MouseArea{
                id:mouseArea
                hoverEnabled: true
                cursorShape: Qt.PointingHandCursor
                anchors.fill: parent
        
                onClicked: control1.clicked()
        
            }
            onPressed: {
                indicator.mx = mouseArea.mouseX
                indicator.my = mouseArea.mouseY
                main.restart()
            }
        }
        

        I already tried using the built-in qml property onClicked, but that way control1.clicked() doesn't get called. And the way I have done it there is no animation when I click the button. by animation I mean the effect after the button is clicked

        Here is how I use it in my main qml

                CustomButton {
                    anchors.horizontalCenter: parent.horizontalCenter
                    radius: 0
                    backgroundColor: "#00c1c9"
                    implicitHeight: 50
                    implicitWidth: 300
                    text: qsTr("Login")
                    onClicked: {
                    usernameField.focus = false;
                    passwordField.focus = false;
                    var jsonObject = {
                        "username": usernameField.text,
                        "password": passwordField.text
                    };
        
                        networkManager.post(jsonObject, "https://secureme.live/register")
                        
                    }
                }
        

        How can I have do my http request after onClick and still have the default animation when the button is clicked ?

        Could you take a look please?

        B 1 Reply Last reply
        0
        • I Ivelin

          @Bob64, hello

          Sorry for the misunderstanding

          I made your answer marked as a solution, but I just realized that it is not working as I expected.

          Let me try again.

          I want to have a button and I want to do stuff on click, but when I use the onClicked proeprty that is built-in in the qml component it removes the default button animation. It removes it with MouseArea onClicked as well.

          By animation I mean the effect that happens after clicking the button.

          How can I have the onClicked property as well as the animation ?

          Could you please clear my thoughts here?

          B Offline
          B Offline
          Bob64
          wrote on last edited by
          #10

          @Ivelin that is not what I would expect.

          What happens if you run this? (I am using Qt 5.15.10 BTW.)

          import QtQuick 2.15
          import QtQuick.Window 2.15
          import QtQuick.Controls 2.15
          
          Window {
              width: 640; height: 480
              visible: true
              Button {
                  width: 150;  height: 100
                  anchors.centerIn: parent
                  onClicked: console.log("HELLO")
              }
          }
          

          If you run with the default style, there isn't much animation anyway but there is at least a change of button colour on clicking. If I run with Material style, I see changes on entering the button area with the mouse, and various effects on clicking.

          None of this seems to have been affected by adding my onClicked handler.

          1 Reply Last reply
          0
          • I Ivelin

            @Bob64

            In my current scenario I have a custom button:

            Button {
                id:control1
              
                implicitWidth: 46
                implicitHeight: 46
            
                property real radius: 8
                property color backgroundColor: "#14A44D"
                property string setIcon: ""
                property color textColor: "#FFFFFF"
            
                property real borderWidth: 0
                property color borderColor: "transparent"
                font.pixelSize: FontStyle.h3
                font.family: FontStyle.getContentFont.name
                font.bold: Font.Bold
                font.weight: Font.Bold
            
                signal clicked
            
                MouseArea{
                    id:mouseArea
                    hoverEnabled: true
                    cursorShape: Qt.PointingHandCursor
                    anchors.fill: parent
            
                    onClicked: control1.clicked()
            
                }
                onPressed: {
                    indicator.mx = mouseArea.mouseX
                    indicator.my = mouseArea.mouseY
                    main.restart()
                }
            }
            

            I already tried using the built-in qml property onClicked, but that way control1.clicked() doesn't get called. And the way I have done it there is no animation when I click the button. by animation I mean the effect after the button is clicked

            Here is how I use it in my main qml

                    CustomButton {
                        anchors.horizontalCenter: parent.horizontalCenter
                        radius: 0
                        backgroundColor: "#00c1c9"
                        implicitHeight: 50
                        implicitWidth: 300
                        text: qsTr("Login")
                        onClicked: {
                        usernameField.focus = false;
                        passwordField.focus = false;
                        var jsonObject = {
                            "username": usernameField.text,
                            "password": passwordField.text
                        };
            
                            networkManager.post(jsonObject, "https://secureme.live/register")
                            
                        }
                    }
            

            How can I have do my http request after onClick and still have the default animation when the button is clicked ?

            Could you take a look please?

            B Offline
            B Offline
            Bob64
            wrote on last edited by
            #11

            @Ivelin I sent my last post before seeing yours.

            In your CustomButton you still have a MouseArea. As explained, this will override the built-in MouseArea of the Button and the behaviours you expect will no longer work.

            I would just get rid of the MouseArea and add your onClicked handler directly to your CustomButton.

            I 1 Reply Last reply
            0
            • B Bob64

              @Ivelin I sent my last post before seeing yours.

              In your CustomButton you still have a MouseArea. As explained, this will override the built-in MouseArea of the Button and the behaviours you expect will no longer work.

              I would just get rid of the MouseArea and add your onClicked handler directly to your CustomButton.

              I Offline
              I Offline
              Ivelin
              wrote on last edited by
              #12

              @Bob64, hello

              your code works just as expected.

              The problem is that when I do this:

              Button {
                  id:control1
                
                  implicitWidth: 46
                  implicitHeight: 46
              
                  property real radius: 8
                  property color backgroundColor: "#14A44D"
                  property string setIcon: ""
                  property color textColor: "#FFFFFF"
              
                  property real borderWidth: 0
                  property color borderColor: "transparent"
                  font.pixelSize: FontStyle.h3
                  font.family: FontStyle.getContentFont.name
                  font.bold: Font.Bold
                  font.weight: Font.Bold
              
                  signal clicked
              
                  onClicked: control1.clicked() 
                  
                  onPressed: {
                      indicator.mx = mouseArea.mouseX
                      indicator.my = mouseArea.mouseY
                      main.restart()
                  }
              }
              

              control1.clicked() doesn't get called. Why is that?

              I have provided how I use it in my main qml upwards

              B 1 Reply Last reply
              0
              • I Ivelin

                @Bob64, hello

                your code works just as expected.

                The problem is that when I do this:

                Button {
                    id:control1
                  
                    implicitWidth: 46
                    implicitHeight: 46
                
                    property real radius: 8
                    property color backgroundColor: "#14A44D"
                    property string setIcon: ""
                    property color textColor: "#FFFFFF"
                
                    property real borderWidth: 0
                    property color borderColor: "transparent"
                    font.pixelSize: FontStyle.h3
                    font.family: FontStyle.getContentFont.name
                    font.bold: Font.Bold
                    font.weight: Font.Bold
                
                    signal clicked
                
                    onClicked: control1.clicked() 
                    
                    onPressed: {
                        indicator.mx = mouseArea.mouseX
                        indicator.my = mouseArea.mouseY
                        main.restart()
                    }
                }
                

                control1.clicked() doesn't get called. Why is that?

                I have provided how I use it in my main qml upwards

                B Offline
                B Offline
                Bob64
                wrote on last edited by
                #13

                @Ivelin I don't know. Try getting rid of signal clicked. It might be masking the Button signal.

                I 1 Reply Last reply
                0
                • B Bob64

                  @Ivelin I don't know. Try getting rid of signal clicked. It might be masking the Button signal.

                  I Offline
                  I Offline
                  Ivelin
                  wrote on last edited by
                  #14

                  @Bob64, yup that was the problem.

                  There is one more thing though

                  Button {
                      id:control
                  
                      implicitWidth: 46
                      implicitHeight: 46
                  
                      property real radius: 8
                      property color backgroundColor: "#14A44D"
                      property string setIcon: ""
                      property color textColor: "#FFFFFF"
                  
                      property real borderWidth: 0
                      property color borderColor: "transparent"
                      font.pixelSize: FontStyle.h3
                      font.family: FontStyle.getContentFont.name
                      font.bold: Font.Bold
                      font.weight: Font.Bold
                  
                  
                      background: Rectangle{
                          implicitHeight: control.implicitHeight
                          implicitWidth: control.implicitWidth
                          radius: control.radius
                          color: control.backgroundColor
                          border.width: control.borderWidth
                          border.color: control.borderColor
                  
                  
                      }
                  
                      onClicked: {
                         control1.clicked()
                      }
                  }
                  

                  I am just trying to add a background and it works, but the animation goes away agian.. why is that ?

                  B Ronel_qtmasterR 2 Replies Last reply
                  0
                  • I Ivelin

                    @Bob64, yup that was the problem.

                    There is one more thing though

                    Button {
                        id:control
                    
                        implicitWidth: 46
                        implicitHeight: 46
                    
                        property real radius: 8
                        property color backgroundColor: "#14A44D"
                        property string setIcon: ""
                        property color textColor: "#FFFFFF"
                    
                        property real borderWidth: 0
                        property color borderColor: "transparent"
                        font.pixelSize: FontStyle.h3
                        font.family: FontStyle.getContentFont.name
                        font.bold: Font.Bold
                        font.weight: Font.Bold
                    
                    
                        background: Rectangle{
                            implicitHeight: control.implicitHeight
                            implicitWidth: control.implicitWidth
                            radius: control.radius
                            color: control.backgroundColor
                            border.width: control.borderWidth
                            border.color: control.borderColor
                    
                    
                        }
                    
                        onClicked: {
                           control1.clicked()
                        }
                    }
                    

                    I am just trying to add a background and it works, but the animation goes away agian.. why is that ?

                    B Offline
                    B Offline
                    Bob64
                    wrote on last edited by
                    #15

                    @Ivelin it's because the animation is implemented in the background of the Button you are using - this is the implementation as provided by Qt. When you implement your own background you completely override the original implementation, so if you want the animations and you want your own customisation, you need to implement it all yourself.

                    It is a weakness of QML's customisation approach IMO that fine-grained customisations are not generally supported - it tends to be all or nothing as soon as you want any customisation.

                    What you could do is to find the Button implementation in the source for the style you are using and use that as the basis for your customised background.

                    1 Reply Last reply
                    0
                    • I Ivelin

                      @Bob64, yup that was the problem.

                      There is one more thing though

                      Button {
                          id:control
                      
                          implicitWidth: 46
                          implicitHeight: 46
                      
                          property real radius: 8
                          property color backgroundColor: "#14A44D"
                          property string setIcon: ""
                          property color textColor: "#FFFFFF"
                      
                          property real borderWidth: 0
                          property color borderColor: "transparent"
                          font.pixelSize: FontStyle.h3
                          font.family: FontStyle.getContentFont.name
                          font.bold: Font.Bold
                          font.weight: Font.Bold
                      
                      
                          background: Rectangle{
                              implicitHeight: control.implicitHeight
                              implicitWidth: control.implicitWidth
                              radius: control.radius
                              color: control.backgroundColor
                              border.width: control.borderWidth
                              border.color: control.borderColor
                      
                      
                          }
                      
                          onClicked: {
                             control1.clicked()
                          }
                      }
                      

                      I am just trying to add a background and it works, but the animation goes away agian.. why is that ?

                      Ronel_qtmasterR Offline
                      Ronel_qtmasterR Offline
                      Ronel_qtmaster
                      wrote on last edited by
                      #16

                      @Ivelin it is simple.When you customize a quick control, you have to hadle the change of color, size and other things yourself.I think you have to read the documentation about customizing quick controls https://doc.qt.io/qt-6/qtquickcontrols-customize.html

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved