Qt QML按钮-如何检查按钮是否用控制修改器按下?

Qt QML按钮-如何检查按钮是否用控制修改器按下?,qt,qml,qt5,Qt,Qml,Qt5,我们如何在同时按下“控制”键的情况下检测QML按钮被点击(选中)?a好的,当您处于按钮的on按下处理程序中时,无法检查是否按下了CTRL键,但您可以解决以下问题: 按下/释放CTRL键时,让QML通知您。将该状态保存在属性中,并在按钮的onPressed处理程序中使用 // Example code Item { id: rootItem anchors.fill: parent focus: true property bool ctrlPressed: fa

我们如何在同时按下“控制”键的情况下检测QML按钮被点击(选中)?

a好的,当您处于按钮的
on按下
处理程序中时,无法检查是否按下了
CTRL
键,但您可以解决以下问题:

按下/释放
CTRL
键时,让QML通知您。将该状态保存在属性中,并在按钮的
onPressed
处理程序中使用

// Example code
Item {
    id: rootItem

    anchors.fill: parent
    focus: true
    property bool ctrlPressed: false
    Keys.onPressed: {
        if (event.key === Qt.Key_Control) {
            ctrlPressed = true
        }
    }
    Keys.onReleased: {
        if (event.key === Qt.Key_Control) {
            ctrlPressed = false
        }
    }

    Button {
        anchors.centerIn: parent

        text: "Press me"

        onPressed: {
            if (rootItem.ctrlPressed)
                console.log("Click with CTRL")
            else
                console.log("Click without CTRL")
        }
    }
}
这只是一个“变通办法”,存在一些问题:

  • rootItem
    必须具有焦点
  • 当按下
    CTRL
    按钮时,应用程序失去焦点(
    ALT
    +
    TAB
    或最小化)时,可能会出现意外行为

另一个选择是在按钮顶部添加您自己的
MouseArea
。您可以使用
propogateComposedEvents
来允许
按钮的默认鼠标处理仍然发生,或者您也可以自己手动重新生成
单击的
信号。这两种选择都不理想,但也许其中一种适合你

Button {
    MouseArea {
        anchors.fill: parent
        propagateComposedEvents: true

        onClicked: {
            if ((mouse.button == Qt.LeftButton) && (mouse.modifiers & Qt.ControlModifier)) {
                doSomething();
            }
        }
    }
}

你不能检查它。我建议你将
event.key===Qt.key\u Control
更改为
event.modifiers&Qt.ControlModifier
检查,这样按下什么都不重要。只有修饰语才重要。