【发布时间】:2016-10-13 15:14:13
【问题描述】:
嗯...也许这个任务应该用 C++ 来实现?我不知道...
我正在使用 QML 制作类似媒体播放器(例如 OSX 中的 QuickTime)界面,它可以检测鼠标事件:
鼠标闲置一段时间后,隐藏所有控制面板,只显示VideoOutput。或者只要鼠标移出窗口,立即执行相同的操作。
所以我的要求是:
- 在整个窗口内监控鼠标移动事件
- 不要阻止任何其他组件上的原始鼠标事件。
或者更准确地说,参见伪代码:
MouseArea {
anchors.fill: applicationWindow // <- This is wrong and will throw error
hoverEnabled: true
/* After reading the Qt doc, this property seems should be
placed in a MouseArea, which is under another MouseArea.
When child has mouse event, it propagate up to parent MouseArea.
So this should be also wrong. */
propagateComposedEvents: true
onClicked: mouse.accepted = false;
onPressed: mouse.accepted = false;
onReleased: mouse.accepted = false;
onDoubleClicked: mouse.accepted = false;
onPressAndHold: mouse.accepted = false;
onPositionChanged: {
console.log("moved!", mouse.x, mouse.y)
mouse.accepted = false
}
}
【问题讨论】:
-
将
MouseArea作为窗口的最后一个子项,而不是使用anchors.fill: parent。不需要propagateComposedEvents。 -
anchors.fill: applicationWindow.contentItem
-
如果您想研究 C++ 解决方案,那么在
QGuiApplication对象上安装事件过滤器应该可以解决问题。见QObject::eventFilter() -
@Fabio 你是对的!把它作为最后一个孩子的作品!谢谢!
-
@Fabio 但是我发现这会导致一些悬停相关的组件无法正常工作......仍然没有解决......:S