QML复杂界面下的按键消息处理——解决焦点丢失按键不响应问题

  在界面结构比较复杂的情况下,经常会出现按键消息不响应的问题,这里给出一个我的解决方案,首先,我们确定好接收按键消息的对象,比如下面的rootRect。
  rootRect接收到按键消息后将其转发给需要处理该按键消息的对象,该例中按键消息传递给了targetPage。

Rectangle {
        id: rootRect
        color: "#00000000"
        anchors.fill: parent

        focus: true
        Keys.enabled: true
        Keys.forwardTo: [targetPage] //转发按键消息

		TargetPage{
			id: targetPage
			onVerifyFocus{
				rootRect.forceActiveFocus();
			}
		}
}
//TargetPage组件
Page{
    id: targetPage
    
    signal verifyFocus()

    Keys.onPressed: {
        if (event.key === Qt.Key_Escape)
        {
            //处理事务
            event.accepted = true;
        }
    }
}

  QML下只有获取焦点的界面才可以处理按键消息。当你操作了其他的对象,比如一个ListView,那么当你回到刚才的rootRect上时,rootObject是收不到按键消息的,设置focus为true有时是没有用的,因为对象的focus还受系统影响。最简单粗暴的方法就是forceActiveFocus()。
  所以我是在TargetPage里加了一个MouseArea,当鼠标移动到该区域时就发出**verifyFocus()**信号,再用这个信号去触发rootObject强制设为当前焦点。此时,rootObject就可以接收到按键消息了。

  QML里还有一种办法是用FocusScope,但当组件特别多时,FocusScope确实不太好控制,所以才想出了这样一个办法。

你可能感兴趣的:(Qt,QML)