嗯...也许这个任务应该用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
}
}
答案 0 :(得分:1)
QML的问题在于,您可以处理或离开某些事件链。
因此,如果您想在一个MouseArea中处理clicked
- 事件,则无法传播pressed
- 事件。
然而,这可能是一个充分的解决方案:
Rectangle {
width: 50
height: 50
color: 'orchid'
MouseArea {
anchors.fill: parent
drag.target: parent
}
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
propagateComposedEvents: true
onMouseXChanged: console.log(mouseX)
onPressed: {
mouse.accepted = false
}
}
您可以在MouseArea中处理鼠标移动,只要按下按钮就可以处理任何其他操作。
如果你需要有关MouseMovement的信息,你可以在你使用的每个其他MouseArea中创建一个单独的信号你... ...或者通过你的每个qml文件传播信号。
所以不要在你写的每个MouseArea中写mouse.accepted = false
:mySingleton.mouseEventSignal()
。您甚至可以添加项目和坐标,这样您就可以将坐标映射到您想要的位置......
这对于快速而肮脏的原型来说可能就足够了。对于真实的事情,也许你需要在C ++中用Kevin Krammer提出