QT 5.10文档中有关Qt Quick键盘焦点的错误?

时间:2018-02-15 23:42:49

标签: c++ qt qtquick2 qt-quick

我正在阅读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 pic1

PIC2 pic2

这是一个错误吗?为什么结果不同?

文件说

我们希望第一个MyWidget对象具有焦点,因此我们将其focus属性设置为true。但是,通过运行代码,我们可以确认第二个小部件是否获得焦点。

同时查看MyWidget和窗口代码,问题很明显 - 有三种类型将focus属性设置为true。两个MyWidgets将焦点设置为true,窗口组件也设置焦点。最终,只有一种类型可以具有键盘焦点,系统必须决定哪种类型获得焦点。创建第二个MyWidget时,它会收到焦点,因为它是将focus属性设置为true的最后一种类型。

我的问题

1.为什么结果不同?在我的结果中,第一个小部件获得焦点。

2.另外,在doc中,“因为它是将焦点属性设置为true的最后一种类型”是什么意思?

您可以从这里获得的文档! Qt doc

3 个答案:

答案 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)

我测试了很多次。结果是一样的。也许文档已经过时了!