yafeilinux 发表于 2019-3-20 18:19:56

第10篇 Qt Quick入门教程之基础(十)文本输入

http://files.qter.org/forum/201902/18/111113cqvyyamqcic8r5yk.jpg.thumb.jpg

## 导语

前面一篇我们讲到了用于文本显示的 Text 项目,这一篇来看两个用于文本输入的项目,分别是作为单行文本输入的 TextInput 和多行文本输入的 TextEdit 。

下面开始教程。



## TextInput

TextInput 项目用来显示单行可编辑的纯文本。TextInput 是一个非常简单的项目,除了显示光标和文本外,默认并没有边框等装饰性效果,所以在使用时一般要为其添加一个可视化的外观。

先来看一个例子:

```
Window {
    visible: true
    width: 320
    height: 240

    Row {
      spacing: 10
      anchors.centerIn: parent

      Text { text: qsTr("请输入密码:") ; font.pointSize: 15
            verticalAlignment: Text.AlignVCenter }

      Rectangle {
            width: 100
            height: 24
            color: "lightgrey"
            border.color: "grey"

            TextInput {
                anchors.fill: parent
                anchors.margins: 2
                font.pointSize: 15
                focus: true
            }
      }
    }
}
```

程序运行效果如下图所示。





### 1.自适应输入框尺寸

按照前面的代码已经为 TextInput 设置了一个基本的外观,但是如果输入过多的内容时,会显示到背景之外,如下图所示:



所以要根据输入的内容来动态改变输入框背景的尺寸,这个可以通过 `contentWidth` 和 `contentHeight` 属性来根据输入内容的宽高设置背景矩形的大小,将前面代码更改如下:

```
Rectangle {
    width: input.contentWidth<100 ? 100 : input.contentWidth + 10
    height: input.contentHeight + 5
    color: "lightgrey"
    border.color: "grey"

    TextInput {
      id: input
      anchors.fill: parent
      anchors.margins: 2
      font.pointSize: 15
      focus: true
    }
}
```

运行效果如下图所示。





### 2.输入掩码

可以使用输入掩码 `inputMask` 来限制输入的内容,输入掩码就是使用一些特殊的字符来限制输入的格式和内容,比如掩码`A` 指定必须输入一个字母 A-Z或a-z,而掩码 `a` 与其类似,只是不强制输入,可以用留空。可用的掩码字符如下表所示。

| 字符(必须输入) | 字符(可留空) |                含义               |
| :--------------: | :------------: | :---------------------------------: |
|      A         |       a      |          只能输入A-Z,a-z         |
|      N         |       n      |      只能输入A-Z,a-z,0-9      |
|      X         |       x      |          可以输入任意字符         |
|      9         |       0      |             只能输入0-9             |
|      D         |       d      |             只能输入1-9             |
|                  |       #      |只能输入加号(+),减号(-),0-9|
|      H         |       h      | 只能输入十六进制字符,A-F,a-f,0-9 |
|      B         |       b      |      只能输入二进制字符,0或1       |

|字符   |               含义               |
| :-----: | :----------------------------------: |
|    >    |   后面的字母字符自动转换为大写   |
|    <    |   后面的字母字符自动转换为小写   |
|   !    |       停止字母字符的大小写转换       |
| [ ] { } |      括号中的内容会直接显示出来      |
|    \    | 将该表中的特殊字符正常显示用作分隔符 |

下面来看示例代码:

```
Rectangle {
    width: input.contentWidth<100 ? 100 : input.contentWidth + 10
    height: input.contentHeight + 5
    color: "lightgrey"
    border.color: "grey"

    TextInput {
      id: input
      anchors.fill: parent
      anchors.margins: 2
      font.pointSize: 15
      focus: true

      inputMask: ">AA_9_a"
      onEditingFinished: text2.text = text
    }
}

Text { id: text2}
```

当输入完成后可以按下回车键,这时会调用 `onEditingFinished` 信号处理器,在其中可以对输入的文本进行处理。注意,只有当所有必须输入的字符都输入后,按下回车键才可以调用该信号处理器,比如这里的掩码字符 `9` 要求必须输入一个数字,如果不输入而是直接留空,那么按下回车键也没有效果。代码运行效果如下图所示。





### 3.验证器

除了使用掩码,还可以使用整数验证器 `IntValidator` 、`DoubleValidator(非整数验证器)`和`RegExpValidator(正则表达式验证器)`。下面的代码可以限制在TextInput中只能输入11到31之间的整数:

```
validator: IntValidator{ bottom: 11; top: 31; }
```

对于正则表达式的使用,可以参考网上教程,或者参考《Qt Creator快速入门(第3版)》第7章的相关内容。



### 4.回显方式

TextInput项目的 `echoMode` 属性指定了文本的显示方式,可用的方式有:

- TextInput.Normal:直接显示文本(默认方式);
- TextInput.Password:使用密码掩码字符(根据不同平台显示效果不同)来代替真实的字符;
- TextInput.NoEcho:不显示输入的内容;
- TextInput.PasswordEchoOnEdit:使用密码掩码字符,但在输入时显示真实字符。

下面来看示例代码:

```
focus: true
echoMode: TextInput.PasswordEchoOnEdit

onEditingFinished: {
    input.focus = false
    text2.text = text
}
```

代码先设置了 TextInput 获得焦点,这样输入字符会直接显示,等输入完成按下回车键以后使 TextInput 失去焦点,这样输入的字符会用密码掩码显示。效果如下图所示。





## TextEdit

TextEdit 项目与 TextInput 类似,不同之处在于,TextEdit 用来显示多行的可编辑的格式化文本,它既可以显示纯文本也可以显示富文本。如下面的代码所示:

```
Window {
    visible: true
    width: 640
    height: 480

    TextEdit {
      width: 240
      textFormat: Text.RichText
      text: "<b>Hello</b> <i>World!</i>"
      font.family: "Helvetica"
      font.pointSize: 20
      color: "blue"
      focus: true
    }
}
```

运行代码可以看到,TextEdit没有提供滚动条、光标跟随和其它在可视部件中通常具有的行为。为了更加人性化的体验,我们可以使用 `Flickable` 来为其提供滚动,实现光标跟随。下面来看一段示例代码:

```
Flickable {
    id: flick
   
    anchors.fill: parent
    contentWidth: edit.paintedWidth
    contentHeight: edit.paintedHeight
    clip: true
   
    function ensureVisible(r)
    {
      if (contentX >= r.x)
            contentX = r.x;
      else if (contentX+width <= r.x+r.width)
            contentX = r.x+r.width-width;
      if (contentY >= r.y)
            contentY = r.y;
      else if (contentY+height <= r.y+r.height)
            contentY = r.y+r.height-height;
    }
   
    TextEdit {
      id: edit
      width: flick.width
      height: flick.height
      font.pointSize: 15
      wrapMode: TextEdit.Wrap
      focus: true
      onCursorRectangleChanged:
            flick.ensureVisible(cursorRectangle)
    }
}

Rectangle {
    id: scrollbar
    anchors.right: flick.right
    y: flick.visibleArea.yPosition * flick.height
    width: 10
    height: flick.visibleArea.heightRatio * flick.height
    color: "lightgrey"
}
```

这里使用的 Flickable 类型到后面会详细讲解。在 TextEdit 中可以设置 `selectByMouse` 属性为 true 来使鼠标可以选取文本内容,可以直接通过键盘快捷键实现文本的复制、粘贴、撤销等操作,当然也可以使用相应的函数来完成。运行效果如下图所示。





## 结语

作为两个基本的文本输入项目,TextInput 和 TextEdit 实现了应有的基本功能,但因为它们基本的外观等设置的缺失,使用起来也需要费些力气,在后面的Qt Quick Controls 2 模块中我们还会介绍功能相同的其他部件,大家到时候可以做个比较。
下载源码:

返回目录

一叶知秋 发表于 2019-3-21 11:01:40

打卡

一叶知秋 发表于 2019-3-27 10:33:50

打卡

北辰 发表于 2019-3-27 11:26:31

打卡,和QWidgets类似,坐等大佬更新:loveliness:

张飞Dear 发表于 2019-3-27 16:06:51

一叶知秋 发表于 2019-3-27 10:33
打卡

https://blog.csdn.net/zqixiao_09请问 这个是你的博客吗

一叶知秋 发表于 2019-3-27 18:56:39

张飞Dear 发表于 2019-3-27 16:06
https://blog.csdn.net/zqixiao_09请问 这个是你的博客吗

不是的。。。。。。。

zhuling】9026 发表于 2019-4-3 09:54:51

学习中,谢谢大佬们的分享

shepherd 发表于 2019-4-4 11:17:54

最近这周咋不更新了?期待啊

yafeilinux 发表于 2019-4-4 19:12:57

shepherd 发表于 2019-4-4 11:17
最近这周咋不更新了?期待啊

休息一下!

shepherd 发表于 2019-4-6 20:51:52

请问版主讲的的这个版本的qt5.12如何建立qt quick ui项目?只看到qt quick application项目的建立向导,求指导。

yafeilinux 发表于 2019-4-7 18:02:40

shepherd 发表于 2019-4-6 20:51
请问版主讲的的这个版本的qt5.12如何建立qt quick ui项目?只看到qt quick application项目的建立向导,求 ...

其他qt quick application里面就包含ui文件的,可以创建试试。

起个名字想泪奔 发表于 2019-4-8 11:49:55

楼主,请问<<qt5编程入门>>是不是要出5.9或者5.12的新版本了??
如果出,我就等一下买新的,如果近期不打算出,我就买老版的先用着:D:D:D

yafeilinux 发表于 2019-4-8 23:31:16

起个名字想泪奔 发表于 2019-4-8 11:49
楼主,请问是不是要出5.9或者5.12的新版本了??
如果出,我就等一下买新的,如果近期不打算出,我就买老版的先 ...

嗯,新版基于5.12,需要等两三个月。

起个名字想泪奔 发表于 2019-4-9 07:53:42

起个名字想泪奔 发表于 2019-4-8 11:49
楼主,请问是不是要出5.9或者5.12的新版本了??
如果出,我就等一下买新的,如果近期不打算出,我就买老版的先 ...

那可就不要太爽了,等等,出了直接就拿下

北辰 发表于 2019-4-26 10:32:14

大佬,赶紧出新版的Qt5 编程入门, 用老版本的好纠结,5.12的不少东西不一样,QtQuick.Control 2.12 的Button 自定义样式竟然只要 background ,不用加 style :L, 看了半天才发现版本的原因呀;

yafeilinux 发表于 2019-4-27 23:40:35

北辰 发表于 2019-4-26 10:32
大佬,赶紧出新版的Qt5 编程入门, 用老版本的好纠结,5.12的不少东西不一样,QtQuick.Control 2.12 的Butt ...

快了!:)

wty 发表于 2019-4-28 15:16:43

求更新,还有20天,毕业设计指望大佬了

起个名字想泪奔 发表于 2019-6-13 16:34:27

yafeilinux 发表于 2019-4-8 23:31
嗯,新版基于5.12,需要等两三个月。

楼主,新书怎么样了? 现在正在学习<<Qt5编程入门>>这本书,浏览整个书,没有发现完整的项目,而且那个老版本的<<Qt及Qt QUick开发实战精解>> 中的qml部分都是入门资料感觉.问一下楼主<<Qt及Qt QUick开发实战精解>>书也会发布新版本吗? 还是说准备单独出一个qml项目的书.最后一个问题,新书什么时候出来呢

yafeilinux 发表于 2019-6-14 18:49:39

起个名字想泪奔 发表于 2019-6-13 16:34
楼主,新书怎么样了? 现在正在学习这本书,浏览整个书,没有发现完整的项目,而且那个老版本的 中的qml部分都 ...

Qt 5编程入门第2版很快会出版,里面全是qml的内容。关于开发实战精解第2版,还需要再等等。

起个名字想泪奔 发表于 2019-7-22 11:59:23

yafeilinux 发表于 2019-6-14 18:49
Qt 5编程入门第2版很快会出版,里面全是qml的内容。关于开发实战精解第2版,还需要再等等。 ...

最近也学习到了 6.10 自定义控件样式,怎么说呢,Qt Quick.Controls1.2 跟 Qt Quick.Controls 2.12 就是完全不一样,2.12完全没有Style的概念. 1.2的版本学习起来或者说用起来,很生涩,但是2.12版本的用起来就很顺畅,感觉很爽. 千言万语,希望楼主赶紧赶紧出版新书,我担心后面的内容又因为版本的原因起了冲突,赶紧出,赶紧出,赶紧出
页: [1] 2
查看完整版本: 第10篇 Qt Quick入门教程之基础(十)文本输入