为什么MouseArea即使主组件被禁用,仍会对悬停事件作出反应?

前端开发 2026-07-09

我有一个包含一些鼠标交互的组件,在应用程序的上下文中它处于不活动状态时我会将其禁用。然而,里面的MouseArea似乎仍然对输入做出反应。这是怎么回事?

最小示例:

Rectangle {
  width: 100
  height: 100
  enabled: false
  color: mouseArea.containsMouse ? "red" : "green"

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

我观察到:
只要把鼠标悬停在矩形上,矩形就会变成红色。这与 这个问题 的情形类似,但我的观察恰恰相反——鼠标事件确实被接收,而我原本以为不会被接收。

我期望的是:
矩形只要 enabled 为false就保持绿色。

我正在使用 Qt 6.10.1

解决方案

这个行为在Qt5和 Qt6之间发生了变化。

这是为了能够在禁用控件上显示工具提示,否则它们需要处于与目标元素不同的对象层级中。

根据 Item 类型 的文档:

注:在Qt 5中,将 enabled 设置为 false 也会阻止悬停事件。这在Qt 6中有所修改,以便让工具提示和类似功能能够在禁用项上工作。

因此,为了防止在禁用对象树中对MouseArea产生悬停事件,你需要在父级被禁用时显式地禁用MouseArea:

使用以下任意一种:

Rectangle {
    width: 100
    height: 100
    enabled: false
    color: mouseArea.containsMouse ? "red" : "green"

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        hoverEnabled: parent.enabled
    }
}

Rectangle {
    width: 100
    height: 100
    enabled: false
    color: mouseArea.containsMouse ? "red" : "green"

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        hoverEnabled: true
        enabled: parent.enabled
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章