为什么MouseArea即使主组件被禁用,仍会对悬停事件作出反应?
我有一个包含一些鼠标交互的组件,在应用程序的上下文中它处于不活动状态时我会将其禁用。然而,里面的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。