【问题标题】:QML: monitoring mouse moving event in the "whole" windowQML:在“整个”窗口中监视鼠标移动事件
【发布时间】:2016-10-13 15:14:13
【问题描述】:

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

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

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

所以我的要求是:

  1. 整个窗口内监控鼠标移动事件
  2. 不要阻止任何其他组件上的原始鼠标事件。

或者更准确地说,参见伪代码:

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

标签: qt qml


【解决方案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()。您甚至可以添加项目和坐标,这样您就可以将坐标映射到您想要的任何内容...

这对于快速而肮脏的原型来说可能就足够了。对于真实的事情,也许你需要像 Kevin Krammer 建议的那样用 C++ 来做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多