es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

QML: El botón dentro de un área del mouse no pasa eventos de desplazamiento del mouse.

Hay un botón dentro de MouseArea:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle {
        id: background
        anchors.fill: parent
        color: mouseArea.containsMouse ? "red" : "green"
    }

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        hoverEnabled: true

        onEntered: console.log("onEntered")
        onExited: console.log("onExited")

        Button {
            id: button
            anchors.centerIn: parent
            width: 200
            height: 100
        }
    }
}

En Qt5, si pasas el ratón sobre el botón, la propiedad containsMouse permanecerá en true y no se llamarán los controladores onExited y onEntered.

Si cambias a Qt6, entonces cuando mueves el ratón sobre el botón, se llamarán los controladores onExited y onEntered y containsMouse se convierte en false.

Necesito que el comportamiento de los eventos hover en Qt6 sea el mismo que en Qt5. ¿Es posible?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible mantener el mismo comportamiento de los eventos de hover en Qt6 como en Qt5. Esto se puede lograr estableciendo la propiedad hoverEnabled del elemento Button en falso. Esto evitará que el botón capture los eventos de hover y permitirá que el elemento MouseArea los reciba en su lugar.

    Aquí tienes un fragmento de código actualizado con la propiedad hoverEnabled establecida en falso:

    import QtQuick 2.15
    import QtQuick.Window 2.15
    import QtQuick.Controls 2.15
    
    Window {
        width: 640
        height: 480
        visible: true
        title: qsTr("Hola Mundo")
    
        Rectangle {
            id: background
            anchors.fill: parent
            color: mouseArea.containsMouse ? "red" : "green"
        }
    
        MouseArea {
            id: mouseArea
            anchors.fill: parent
            hoverEnabled: true
    
            onEntered: console.log("onEntered")
            onExited: console.log("onExited")
            //onPositionChanged: console.log("position", mouse.x, mouse.y)
    
            Button {
                id: button
                anchors.centerIn: parent
                width: 200
                height: 100
                hoverEnabled: false // establece hoverEnabled en falso para evitar que el botón capture eventos de hover
            }
        }
    }
    

    Con esta modificación, el elemento MouseArea recibirá correctamente los eventos de hover y la propiedad containsMouse se actualizará adecuadamente, incluso cuando el mouse esté sobre el elemento Button.

Comments are closed.