【问题标题】:Check if the mouse and spacebar are pressed at the same time in QML检查QML中是否同时按下鼠标和空格键
【发布时间】:2019-11-15 01:16:36
【问题描述】:

我想使用 QML 检查鼠标和空格键是否同时被按下

我可以检查鼠标和其他修饰键是否被按下。例如:

MouseArea {
  onPressed: {
    if(mouse.modifiers & QT.ControlModifier) {
      // do something
    }
  }
}

但是,我知道如何检查密钥的唯一方法是在 Keys.onPressed 处理程序内部。 MouseArea onPressedKeys.onPressed之间有没有办法统一通信?

【问题讨论】:

  • 同时是什么意思?时间上总会有一个小的差距。因此,您可以在其中一个被按下时启动计时器,并检查第二个时的时差。
  • @folibis 同一时间意味着检测两个键是否同时按住。让我绊倒的部分是放置 Keys.onPressed 处理程序的位置。因为我(假设)我不能将它嵌套在鼠标区域块内。我需要能够在 MouseArea onPressed 和 Keys.onPressed 之间传递一些信息。

标签: qt input keyboard qml mouse


【解决方案1】:

这是同一问题的示例代码:

MyItem.qml

import QtQuick 2.12

Rectangle {
    id: element
    width: 100
    height: 100
    color: "orange"
    signal mySignal()
    property int myState: MyItem.Bits.None
    enum Bits {
        None = 0,
        MouseOn = 1,
        KeyOn = 2,
        AllOn = 3
    }

    function checkBits()
    {
        if(element.myState === MyItem.Bits.AllOn)
        {
            element.mySignal();
            element.myState = MyItem.Bits.None;
        }
    }

    MouseArea {
        anchors.fill: parent
        onPressed: {
            element.myState |= MyItem.Bits.MouseOn;
            element.checkBits();
        }
        onReleased: {
            element.myState &= ~MyItem.Bits.MouseOn;
            element.checkBits();
        }
    }
    Keys.onSpacePressed: {
        element.myState |= MyItem.Bits.KeyOn;
        element.checkBits();
    }
    Keys.onReleased: {
        if(element.myState & MyItem.Bits.KeyOn)
        {
            element.myState &= ~MyItem.Bits.KeyOn;
            element.checkBits();
        }
    }
}

ma​​in.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 600
    height: 400

    MyItem {
        anchors.centerIn: parent
        focus: true
        onMySignal: {
            console.log("My Signal")
        }
    }
}

MySignal 将在鼠标和空格键同时触发。
注意,enum 需要 Qt 5.10 或更高版本

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多