找回密码
 立即注册
收起左侧

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

19
回复
2594
查看
[复制链接]
累计签到:814 天
连续签到:2 天
来源: Qt教程 2019-3-20 18:19:56 显示全部楼层 |阅读模式


导语

前面一篇我们讲到了用于文本显示的 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 设置了一个基本的外观,但是如果输入过多的内容时,会显示到背景之外,如下图所示:

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

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.验证器

除了使用掩码,还可以使用整数验证器 IntValidatorDoubleValidator(非整数验证器)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 模块中我们还会介绍功能相同的其他部件,大家到时候可以做个比较。


下载源码:

返回目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:12 天
连续签到:1 天
2019-3-27 11:26:31 显示全部楼层
打卡,和QWidgets类似,坐等大佬更新
回复 支持 反对

使用道具 举报

累计签到:297 天
连续签到:1 天
2019-3-27 16:06:51 显示全部楼层

点评

不是的。。。。。。。  详情 回复 发表于 2019-3-27 18:56
回复 支持 反对

使用道具 举报

累计签到:758 天
连续签到:2 天
2019-3-27 18:56:39 显示全部楼层
张飞Dear 发表于 2019-3-27 16:06
https://blog.csdn.net/zqixiao_09  请问 这个是你的博客吗

不是的。。。。。。。
回复 支持 反对

使用道具 举报

尚未签到

2019-4-3 09:54:51 显示全部楼层
学习中,谢谢大佬们的分享
回复 支持 反对

使用道具 举报

尚未签到

2019-4-4 11:17:54 显示全部楼层
最近这周咋不更新了?期待啊

点评

休息一下!  详情 回复 发表于 2019-4-4 19:12
回复 支持 反对

使用道具 举报

累计签到:814 天
连续签到:2 天
2019-4-4 19:12:57 显示全部楼层
shepherd 发表于 2019-4-4 11:17
最近这周咋不更新了?期待啊

休息一下!
回复 支持 反对

使用道具 举报

尚未签到

2019-4-6 20:51:52 显示全部楼层
请问版主讲的的这个版本的qt5.12如何建立qt quick ui项目?只看到qt quick application项目的建立向导,求指导。

点评

其他qt quick application里面就包含ui文件的,可以创建试试。  详情 回复 发表于 2019-4-7 18:02
回复 支持 反对

使用道具 举报

累计签到:814 天
连续签到:2 天
2019-4-7 18:02:40 显示全部楼层
shepherd 发表于 2019-4-6 20:51
请问版主讲的的这个版本的qt5.12如何建立qt quick ui项目?只看到qt quick application项目的建立向导,求 ...

其他qt quick application里面就包含ui文件的,可以创建试试。
回复 支持 反对

使用道具 举报

累计签到:102 天
连续签到:1 天
2019-4-8 11:49:55 显示全部楼层
楼主,请问<<qt5编程入门>>是不是要出5.9或者5.12的新版本了??
如果出,我就等一下买新的,如果近期不打算出,我就买老版的先用着  

点评

嗯,新版基于5.12,需要等两三个月。  详情 回复 发表于 2019-4-8 23:31
回复 支持 反对

使用道具 举报

累计签到:814 天
连续签到:2 天
2019-4-8 23:31:16 显示全部楼层
起个名字想泪奔 发表于 2019-4-8 11:49
楼主,请问是不是要出5.9或者5.12的新版本了??
如果出,我就等一下买新的,如果近期不打算出,我就买老版的先 ...

嗯,新版基于5.12,需要等两三个月。
回复 支持 反对

使用道具 举报

累计签到:102 天
连续签到:1 天
2019-4-9 07:53:42 显示全部楼层
起个名字想泪奔 发表于 2019-4-8 11:49
楼主,请问是不是要出5.9或者5.12的新版本了??
如果出,我就等一下买新的,如果近期不打算出,我就买老版的先 ...

那可就不要太爽了,等等,出了直接就拿下
回复 支持 反对

使用道具 举报

累计签到:12 天
连续签到:1 天
2019-4-26 10:32:14 显示全部楼层
大佬,赶紧出新版的Qt5 编程入门, 用老版本的好纠结,5.12的不少东西不一样,QtQuick.Control 2.12 的Button 自定义样式竟然只要 background ,不用加 style , 看了半天才发现版本的原因呀;

点评

快了!  详情 回复 发表于 2019-4-27 23:40
回复 支持 反对

使用道具 举报

累计签到:814 天
连续签到:2 天
2019-4-27 23:40:35 显示全部楼层
北辰 发表于 2019-4-26 10:32
大佬,赶紧出新版的Qt5 编程入门, 用老版本的好纠结,5.12的不少东西不一样,QtQuick.Control 2.12 的Butt ...

快了!
回复 支持 反对

使用道具 举报

尚未签到

2019-4-28 15:16:43 显示全部楼层
求更新,还有20天,毕业设计指望大佬了
回复 支持 反对

使用道具 举报

累计签到:102 天
连续签到:1 天
2019-6-13 16:34:27 显示全部楼层
yafeilinux 发表于 2019-4-8 23:31
嗯,新版基于5.12,需要等两三个月。

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

点评

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

使用道具 举报

累计签到:814 天
连续签到:2 天
2019-6-14 18:49:39 显示全部楼层
起个名字想泪奔 发表于 2019-6-13 16:34
楼主,新书怎么样了? 现在正在学习这本书,浏览整个书,没有发现完整的项目,而且那个老版本的 中的qml部分都 ...

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

点评

最近也学习到了 6.10 自定义控件样式,怎么说呢,Qt Quick.Controls1.2 跟 Qt Quick.Controls 2.12 就是完全不一样,2.12完全没有Style的概念. 1.2的版本学习起来或者说用起来,很生涩,但是2.12版本的用起来就很顺畅,感  详情 回复 发表于 2019-7-22 11:59
回复 支持 反对

使用道具 举报

累计签到:102 天
连续签到:1 天
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版本的用起来就很顺畅,感觉很爽. 千言万语,希望楼主赶紧赶紧出版新书,我担心后面的内容又因为版本的原因起了冲突,赶紧出,赶紧出,赶紧出
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册