QML将焦点放在组件上

  • 本文关键字:组件 焦点 QML qt qml
  • 更新时间 :
  • 英文 :


我有这样的代码:

//main.qml
Window {
id: root
width: 640
height: 480
visible: true
title: qsTr("Hello World")
objectName: "Window"
onActiveFocusItemChanged: console.log("***** ACTIVE FOCUS:", activeFocusItem, "*****")
StackView {
anchors.fill: parent
initialItem: "qrc:/LoaderPage.qml"
objectName: "StackView"
onCurrentItemChanged: currentItem.forceActiveFocus()
}
}

//LoaderPage.qml
Item {
objectName: "ItemLoaderPage"
//    Keys.forwardTo: loader
Loader {
id: loader
anchors.fill: parent
objectName: "Loader"
focus: true
sourceComponent: rect1
}
Component {
id: rect1
Rectangle {
Keys.onReleased: {
if(event.key === Qt.Key_Escape || event.key === Qt.Key_Back)
{
console.log("Esc or back pressed from", objectName)
event.accepted = true
}
}
objectName: "Rectangle"
focus: true
color: "blue"
}
}
}

我试图给矩形的焦点在rect1组件和捕获关键事件,但与此代码,焦点总是给予ItemLoaderPage,我不能捕获关键事件。怎么解呢?

我发现保持键盘焦点是Qt的一大弱点,文档使它听起来很简单,但在实践中我总是在我甚至不知道焦点去哪里的情况下结束。

我通常诉诸于手动调用forceActiveFocus(),而不是依赖Qt自动做正确的事情。这是一个脆弱的解决方案,但它至少是我觉得我可以控制的。

Loader {
sourceComponent: rect1
onLoaded: {
item.forceActiveFocus();
}
}

加载器和矩形已通过您的属性请求焦点:

focus: true

如果我理解了focus-attribute的意思,你应该试着只设置一次焦点。

最新更新