我们已经使用过MouseArea(鼠标区域)作为鼠标输入元素。这里我们将更多的介绍关于键盘输入的一些东西。我们开始介绍文本编辑的元素:TextInput(文本输入)和TextEdit(文本编辑)。

7.1 TextInput(文本输入)

文本输入允许用户输入一行文本。这个元素支持使用正则表达式验证器来限制输入和输入掩码的模式设置。
GXV`6U7G}~0CCK9SR(IZ@$L.png

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. width: 200
  5. height: 100
  6. TextInput {
  7. id: input1
  8. x: 8; y: 8
  9. width: 96; height: 25
  10. text: "Text Input 1"
  11. }
  12. TextInput{
  13. id: input2
  14. x: 8; y: 36
  15. width: 96; height: 20
  16. text: "Text Input 2"
  17. }
  18. TextInput {
  19. id: input3
  20. x: 8; y: 64
  21. validator: IntValidator{bottom: 11; top: 31;} // 输入范围 [11,13]
  22. width: 96; height: 20
  23. }
  24. }

设置按键向导,按tab键可以切换光标的位置

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. width: 200
  5. height: 100
  6. TextInput {
  7. id: input1
  8. x: 8; y: 8
  9. width: 96; height: 25
  10. text: "Text Input 1"
  11. KeyNavigation.tab: input2 // 按键向导
  12. }
  13. TextInput{
  14. id: input2
  15. x: 8; y: 36
  16. width: 96; height: 20
  17. text: "Text Input 2"
  18. KeyNavigation.tab: input3
  19. }
  20. TextInput {
  21. id: input3
  22. x: 8; y: 64
  23. validator: IntValidator{bottom: 11; top: 31;}
  24. width: 96; height: 20
  25. KeyNavigation.tab: input1
  26. }
  27. }

TextInput增加矩形框,以便用户鉴别这是一个输入元素(如果文本过长,前面的文本会跑到边框的签名)
![057MW66I2W4MDF%UZIINWP.png

  1. // TLineEditV1.qml
  2. import QtQuick 2.15
  3. Rectangle {
  4. width: 96; height: input.height + 8
  5. color: "lightsteelblue"
  6. border.color: "gray"
  7. property alias text: input.text
  8. property alias input: input
  9. TextInput {
  10. id: input
  11. anchors.fill: parent
  12. anchors.margins: 4
  13. focus: true
  14. }
  15. }
  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. width: 200
  5. height: 100
  6. TLineEditV1 {
  7. id: input1
  8. x: 8; y: 8
  9. width: 96; height: 25
  10. text: "Text Input 1"
  11. KeyNavigation.tab: input2.input // 按键向导
  12. }
  13. TLineEditV1{
  14. id: input2
  15. x: 8; y: 36
  16. width: 96; height: 20
  17. text: "Text Input 2"
  18. KeyNavigation.tab: input3.input
  19. }
  20. TLineEditV1 {
  21. id: input3
  22. x: 8; y: 64
  23. input.validator: IntValidator{bottom: 11; top: 31;}
  24. width: 96; height: 20
  25. KeyNavigation.tab: input1.input
  26. }
  27. }

7.2 焦点区域(FocusScope)

一个焦点区域(focus scope)定义了如果焦点区域接收到焦点,它的最后一个使用focus:true的子元素接收焦点,它将会把焦点传递给最后申请焦点的子元素。我们创建了第二个版本的TLineEdit组件,称作TLineEditV2,使用焦点区域(focus scope)作为根元素。

  1. // TLineEditV2.qml
  2. import QtQuick 2.15
  3. FocusScope {
  4. width: 96; height: input.height + 8
  5. Rectangle {
  6. anchors.fill: parent
  7. color: "lightsteelblue"
  8. border.color: "gray"
  9. }
  10. property alias text: input.text
  11. property alias input: input
  12. TextInput {
  13. id: input
  14. anchors.fill: parent
  15. anchors.margins: 4
  16. focus: true
  17. }
  18. }

现在我们的例子将像下面这样:

  1. Rectangle {
  2. ...
  3. TLineEditV2 {
  4. id: input1
  5. ...
  6. }
  7. TLineEditV2 {
  8. id: input2
  9. ...
  10. }
  11. }

按下Tab按键可以成功的在两个组件之间切换焦点,并且能够正确的将焦点锁定在组件内部的子元素中。

7.3 文本编辑(TextEdit)

文本编辑(TextEdit)元素与文本输入(TextInput)非常类似,它支持多行文本编辑。它不再支持文本输入的限制,但是提供了已绘制文本的大小查询(paintedHeight,paintedWidth)。我们也创建了一个我们自己的组件TTextEdit,可以编辑它的背景,使用focus scope(焦点区域)来更好的切换焦点。
image.png

  1. import QtQuick 2.15
  2. FocusScope {
  3. width: 96; height: 96
  4. Rectangle {
  5. anchors.fill: parent
  6. color: "lightsteelblue"
  7. border.color: "gray"
  8. }
  9. property alias text: input.text
  10. property alias input: input
  11. TextEdit {
  12. id: input
  13. anchors.fill: parent
  14. anchors.margins: 4
  15. focus: true
  16. }
  17. }
  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. width: 136
  5. height: 120
  6. color: "linen"
  7. TTextEdit {
  8. id: input
  9. x: 8; y: 8
  10. width: 120; height: 104
  11. focus: true
  12. text: "Text Edit"
  13. }
  14. }

7.4 按键元素(Key Element)

附加属性key允许你基于某个按键的点击来执行代码。例如使用updown按键来移动一个方块,leftright按键来旋转一个元素,plusminus按键来缩放一个元素。

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. width: 400; height: 200
  5. Rectangle {
  6. color: "red"
  7. id: square
  8. x: 8; y: 8
  9. width: 45
  10. height: 45
  11. border.color: Qt.lighter(color)
  12. }
  13. focus: true
  14. Keys.onLeftPressed: square.x -= 8
  15. Keys.onRightPressed: square.x += 8
  16. Keys.onUpPressed: square.y -= 8
  17. Keys.onDownPressed: square.y += 8
  18. Keys.onPressed: {
  19. switch(event.key) {
  20. case Qt.Key_Plus:
  21. square.scale += 0.2
  22. break;
  23. case Qt.Key_Minus:
  24. square.scale -= 0.2
  25. break;
  26. }
  27. }
  28. }

1S4GXWH01CW$}U6DSFAJ5Y2.png