子类Keys.onPressed和MouseArea.onClicked

时间:2018-08-02 06:19:03

标签: qt qml

我有一个要重用的基本窗口。基本窗口具有一些键盘处理功能。

ApplicationWindow
{
  id: base
  visible: true
  width: 600
  height: 400

  Item
  {
    id: baseitem
    anchors.fill: parent
    focus: true

    Keys.onPressed:
    {
        console.log("base key: " + event.key)
        event.accepted = true
        // if (event.key === Qt.Key_Escape) {...}
    }

    MouseArea
    {
        id: basemousearea
        anchors.fill: parent
        onClicked:
        {
            console.log("base basemousearea clicked")
        }
    }
  }
}

在重用此基本窗口时,我想添加更多的键盘处理功能。例如,基本窗口应仅处理Esc和Return,而重用窗口应处理其他一些键。但是,这不起作用。总是只执行基本窗口的Keys.onPressed。我是否将event.accepted设置为true或false也无关紧要。 (出于好奇,为了比较起见,我还添加了鼠标处理功能。在这种情况下,情况恰好相反,仅执行重用窗口的MouseArea.onClicked,而没有执行基本窗口的鼠标。)我该如何同时获取基本窗口的并执行重用窗口的Keys.onPressed?

这是重用窗口的代码:

Basewindow
{
  id: main

  Item
  {
    anchors.fill: parent
    focus: true

    Keys.onPressed:
    {
        console.log("main key: " + event.key)
        event.accepted = true
        // if (event.key === Qt.Key_F3) {...}
    }

    MouseArea
    {
        id: mainmousearea
        anchors.fill: parent
        onClicked:
        {
            console.log("main mainmousearea clicked")
        }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

由于唯一关注的Item可以接收键事件,因此您必须将focus: true设置为该项。您可以通过接受事件或使用Keys.forwardTo: []将事件转发到另一个项目来管理事件。例如:

import QtQuick 2.11
import QtQuick.Window 2.2 

Window {
    visible: true
    width: 400
    height: 400

    Item {
        id: item1
        anchors.fill: parent
        Keys.onPressed: {
            console.log("Main: " + event.key);
            item2.focus = true;
        }
        focus: true
        Keys.forwardTo: [item2 ]
    }
    Sub {
        id: item2
        onChange: {
            item1.focus = true;
        }
    }
}

Sub.qml

import QtQuick 2.11

Item {
    signal change()   
    Keys.onPressed: {
        console.log("Sub: " + event.key);
        change();
    }
}

有关更多信息,请参见Key Handling Priorities