QML:在“整个”窗口中监视鼠标移动事件

时间:2016-10-12 05:04:18

标签: qt qml

  

嗯...也许这个任务应该用C ++实现?我不知道......

我正在使用QML制作媒体播放器(例如OSX中的QuickTime)界面,可以检测鼠标事件:

当鼠标闲置一段时间后,隐藏所有控制面板并仅显示VideoOutput。或者只要鼠标离开窗口,立即执行相同的操作。

所以我的要求是:

  1. 整个窗口
  2. 中监控鼠标移动事件
  3. 不要阻止任何其他组件上的原始鼠标事件。
  4. 或者更准确地说,请参阅伪代码:

    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
        }
    }
    

1 个答案:

答案 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 = falsemySingleton.mouseEventSignal()。您甚至可以添加项目和坐标,这样您就可以将坐标映射到您想要的位置......

这对于快速而肮脏的原型来说可能就足够了。对于真实的事情,也许你需要在C ++中用Kevin Krammer提出