我正在阅读Qt doc,以便在Qt Quick中学习键盘焦点!我运行文档中的代码。但是,结果与文件的结果不同!代码如下。
main.qml
//Window code that imports MyWidget
Rectangle {
id: window
color: "white"; width: 240; height: 150
Column {
anchors.centerIn: parent; spacing: 15
MyWidget {
focus: true //set this MyWidget to receive the focus
color: "lightblue"
}
MyWidget {
color: "palegreen"
}
}
MyWidget.qml
Rectangle {
id: widget
color: "lightsteelblue"; width: 175; height: 25; radius: 10; antialiasing:
true
Text { id: label; anchors.centerIn: parent}
focus: true
Keys.onPressed: {
if (event.key == Qt.Key_A)
label.text = 'Key A was pressed'
else if (event.key == Qt.Key_B)
label.text = 'Key B was pressed'
else if (event.key == Qt.Key_C)
label.text = 'Key C was pressed'
}
}
pic1是doc的结果。而pic2是我运行的结果,我只是从doc复制代码并运行它。
PIC1
这是一个错误吗?为什么结果不同?
文件说:
我们希望第一个MyWidget对象具有焦点,因此我们将其focus属性设置为true。但是,通过运行代码,我们可以确认第二个小部件是否获得焦点。
同时查看MyWidget和窗口代码,问题很明显 - 有三种类型将focus属性设置为true。两个MyWidgets将焦点设置为true,窗口组件也设置焦点。最终,只有一种类型可以具有键盘焦点,系统必须决定哪种类型获得焦点。创建第二个MyWidget时,它会收到焦点,因为它是将focus属性设置为true的最后一种类型。
我的问题:
1.为什么结果不同?在我的结果中,第一个小部件获得焦点。
2.另外,在doc中,“因为它是将焦点属性设置为true的最后一种类型”是什么意思?
您可以从这里获得的文档! Qt doc
答案 0 :(得分:0)
当我运行代码时,我会得到与您相同的结果,但这并不重要。这里的要点是要理解,如果没有FocusScope
,您无法控制哪个对象从系统获得焦点(您无法保证按照创建QML对象的顺序)。
您是否尝试在第二个focus: true
上设置MyWidget
?如果您尝试,第一个小部件仍会接收键盘事件,除非您使用FocusScope
。
请注意,您也可以从MyWidget.qml中删除focus: true
,甚至不需要手动添加FocusScope
(它将自动由应用程序窗口管理)。
答案 1 :(得分:0)
尝试运行以下修改:
MyWidget { //the focus is here
color: "palegreen"
}
MyWidget {
focus: true //set this MyWidget to receive the focus
color: "lightblue"
}
MyWidget {
color: "palegreen"
}
答案 2 :(得分:-1)
我测试了很多次。结果是一样的。也许文档已经过时了!