QML学习笔记(二十二)QML的TextInput - 实践

news/2025/10/29 12:06:53/文章来源:https://www.cnblogs.com/yangykaifa/p/19174040

前言

本节我们将学习TextInput元素。这是一个允许用户输入单行文本的元素,它常用于收集信息的表单中,例如如果你希望收集某人的信息,你可以获取其名字和姓氏。它提供了一些信号和属性,可用于操作用户输入的数据。它在QT中十分常用,接下来我们将学习一下。

一、了解TextInput

查阅帮助文档:
在这里插入图片描述
直接翻译过来:

TextInput类型显示一行可编辑的纯文本。
TextInput用于接受一行文本输入。可以对TextInput项施加输入约束(例如,通过验证器或inputMask),将echoMode设置为适当的值可以将TextInput用于密码输入字段。
在macOS上,Home/End的向上/向下键绑定被明确禁用。如果你想要这样的绑定(在任何平台上),你需要在QML中构建它们。
另请参见文本编辑和文本。

简单来说,这就是一个文本输入框。但因为此前我已经接触过QML中的TextField组件,所以我对此有些困惑。同样的,这个东西也应该类比一下QWidget中的QLineEdit,所以让kimi列一下表格对比(不一定完全正确)。

类比维度QLineEdit (QWidget)TextField (QML, Controls 2)TextInput (QML, Basic)
功能完整度≈ TextField≈ QLineEdit只提供核心编辑能力
外观&主题原生平台样式自动随 Qt Quick 主题 (Material/Universal) 变化无样式,需自绘
信号丰富度returnPressed()textEdited()editingFinished()同样具备 onAcceptedonEditingFinishedonClearClickedonTextChanged
校验/占位/清除手动拼控件或 setClearButtonEnabled()一行 clearable: truevalidator: IntValidator{}placeholderText全部自己实现

最后得出一个初步的结论吧,TextInput 是QML中最基础、最简单的文本输入组件,它甚至没有复杂的样式属性,可能只有简单的颜色字体这种,相关的信号也比较简单。
基于这种情况,考虑到实际开发中需要开发样式,首选肯定是TextField 。不过没有关系,学习讲求循序渐进,我们先代码层面上学习一遍TextInput 。

二、TextInput 和 onEditingFinished

代码如下:

import QtQuick 2.14
import QtQuick.Window 2.14
Window {
visible: true
width: 640
height: 480
title: qsTr("QmlTextInput")
Row{
x: 10
y: 10
spacing: 20
Rectangle{
id: firstNameRectId
width: firstNameLabelId.implicitWidth + 20
height: firstNameLabelId.implicitHeight + 20
color: "dodgerblue"
Text{
id: firstNameLabelId
anchors.centerIn: parent
text: "First name"
}
}
Rectangle{
id: firstNameTextRectId
width: firstNameTextId.implicitWidth + 20
height: firstNameTextId.implicitHeight + 20
color: "grey"
TextInput{
id: firstNameTextId
anchors.centerIn: parent
focus: true
text: "Type in your first name"
onEditingFinished: {
firstNameLabelId.text = text
}
}
}
}
}

这里放置了两个矩形,分别是一个纯文本展示Text和文字输入TextInput。
可以看到它们的使用都是十分相似的,TextInput只多了少量东西。
1.focus: true
它让这个TextInput 在组件完成实例化后立刻获得键盘焦点,用户无需再点一下就能直接打字。
2.onEditingFinished
这是一个信号处理器,直接翻译过来就是编辑完成的时候会触发。
什么叫编辑完成,很简单,就是你键盘输入完,按下回车的时候。
这里直接在onEditingFinished中写了,让你它的输入文本同步到第一个矩形的文本之中。

我们看下效果:
在这里插入图片描述

此时,我们随便修改一下灰色矩形的文本,并按一下回车:
在这里插入图片描述
这里必须说明一下,编辑完成除了按回车这种直观的行为外,还有其他行为可能会触发,比如点击一下任务栏,或者按一下窗口最小化这种也会被判定为输入完成。

三、实现自定义组件

TextInput功能比较简单,似乎没有placeholder text这种效果。所谓placeholder text,就是输入框为空时显示的浅灰色提示语,一旦用户敲下第一个字符,它就会自动消失;当用户把内容全部删掉,提示语又会重新出现。
因此,为了实现这个功能,我们可以将TextInput稍作设计,实现我们自定义的输入组件。同时,强化一下对于自定义组件的掌握程度。

我们新建一个LabelTextInput.qml,这同时也是组件名,以下是它的代码:

import QtQuick 2.14
import QtQuick.Window 2.14
Item {
readonly property alias text: textInputId.text
property alias color: textInputRectId.color
property alias placeHolderText: placeHolderId.text
property alias rect: textInputRectId
signal editingFinished
Rectangle{
id: textInputRectId
width: textInputId.text.length
? textInputId.implicitWidth + 20
: placeHolderId.implicitWidth + 20
height: textInputId.implicitHeight + 20
color: "grey"
Text{
id: placeHolderId
anchors{
centerIn: parent
fill: parent
}
verticalAlignment: TextInput.AlignVCenter
visible: !textInputId.text && !textInputId.inputMethodComposing
text: "null"
}
TextInput{
id: textInputId
anchors.centerIn: parent
anchors.fill: parent
verticalAlignment: TextInput.AlignVCenter
focus: true
onEditingFinished: {
editingFinished
}
}
Component.onCompleted: {
textInputId.editingFinished.connect(editingFinished)
}
}
}

看起来好像很复杂,实际上就多了一个Text做占位符。我们可以通过textInputId的length来判断当前是否有输入,然后改变组件尺寸和是否显示占位符文本。比如这里宽度用了条件表达式:

width: textInputId.text.length
? textInputId.implicitWidth + 20
: placeHolderId.implicitWidth + 20

这里是当输入框有文本且正在输入的时候,会显示组件:

visible: !textInputId.text && !textInputId.inputMethodComposing

至于其他的属性暴露别名、信号连接信号之类的东西,之前文章也讲过了,这里就不赘述,代码还是相对比较简单的。
然后我们修改main.qml的代码:

Window {
visible: true
width: 640
height: 480
title: qsTr("QmlTextInput")
Row{
x: 10
y: 10
spacing: 20
Rectangle{
id: firstNameRectId
width: firstNameLabelId.implicitWidth + 20
height: firstNameLabelId.implicitHeight + 20
color: "dodgerblue"
Text{
id: firstNameLabelId
anchors.centerIn: parent
text: "First name"
}
}
LabelTextInput{
id: firstNameTextRectId
width: rect.width + 20
height: rect.height + 20
color: "grey"
placeHolderText: "Type in your first name"
onEditingFinished: {
firstNameLabelId.text = text
}
}
}
}

我们用LabelTextInput取代了TextInput,还提供了placeHolderText这个属性可以指定占位符文本。因为内部矩形本身是自适应大小,所以这里直接用rect来设置了尺寸。最后自定义的信号也能触发修改第一个矩形文本的功能。
让我们看一下运行效果:
请添加图片描述
完美实现,符合预期!

四、总结

本节第一次接触了文本输入框这一元素,而这也是非常常见和常用的组件了。基于文本输入框,我们可以实现登录界面的用户名密码登录,可以实现各种信息填写。当然,TextInput的功能还比较简单,我们需要学习更多更复杂的组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++内联函数inline及与宏使用的比较

一、内联函数inline常规的函数调用,会创建一个新的函数调用栈帧,并跳转到函数定义处执行,结束后再释放栈空间(栈内存)返回调用处。即一个函数要在被另一个函数调用的时候,才有生命,才会为其准备对应的内存空间,…

2025年江苏网站制作推广服务权威推荐:南京网站建设优化/无锡官网制作方案/徐州网站开发公司服务商精选

在当前数字经济蓬勃发展的背景下,江苏地区的网站制作推广服务市场展现出旺盛的需求。企业对于专业、高效、可靠的网站制作与数字化推广服务的需求持续上升,特别是在用户体验优化、搜索引擎排名提升和数字化营销等领域…

vue2x添加一个元素拖拽功能

拖拽元素绑定:<div class="add-twin-wrap-container"><div class="add-twin-wrap" @click.stop><p class="title" @mousedown="onDragStart">添加场景类型…

解决 pnpm 安装 Electron 缺少二进制文件的问题

解决 pnpm 安装 Electron 缺少二进制文件的问题 问题描述 使用 pnpm 安装 Electron 时,可能出现以下错误: Error: Electron failed to install correctly, please delete node_modules/electron and try installing …

基于libsvm的支持向量机在MATLAB中的实现

一、环境准备 1. 工具箱安装 % 下载并安装libsvm-mat工具箱(推荐使用林教授版本) % 解压后添加到MATLAB路径 addpath(genpath(libsvm-mat-2.91));% 验证安装 version -libsvm2. 数据准备 % 加载示例数据(鸢尾花数据…

【ACM出版 | 高录用快见刊、检索】第五届工商管理与数据科学国际学术会议 (BADS 2025)

第五届工商管理与数据科学国际学术会议 (BADS 2025)将于2025年11月11-12日在中国广州南方学院召开。【合作ACM出版社审稿录用速度快,最快投稿后2-4个月左右见刊,见刊后1个月左右EI、Scopus、谷歌学术检索。】 【含on…

2025年酒精回收塔生产厂家权威推荐榜单:DMF回收塔/甲醇回收塔/乙醇回收塔源头厂家精选

2025年酒精回收塔生产厂家权威推荐榜单:DMF回收塔/甲醇回收塔/乙醇回收塔源头厂家精选 在化工、制药和食品行业,一台高效的酒精回收塔能将30%的稀酒精提纯至95%,帮助企业大幅降低生产成本。 酒精回收塔作为化工、制…

2025 年投入式液位计厂家联系方式推荐,杭州浙达精益提供专业液位测量设备与技术支持

行业背景 在工业生产、水利工程、能源开采等众多领域,液位测量是保障生产安全、提升运营效率的关键环节。随着工业自动化水平的不断提升,市场对液位计的精度、稳定性、耐用性要求愈发严格,尤其在一些复杂工况下,如…

直扩信号参数估计:载频、码速率和扩频增益

MATLAB程序用于估计接收到的直扩信号的载频、码速率和扩频增益: 主程序文件 %% 直扩信号参数估计:载频、码速率和扩频增益 clear; close all; clc;fprintf(=== 直扩信号参数估计 ===\n);%% 生成测试直扩信号(如果无…

2025 年防爆位移传感器厂家联系方式推荐,杭州浙达精益提供专业设备与可靠技术支持

行业背景 在工业生产领域,位移测量是保障设备精准运行、提升生产安全与效率的关键环节,尤其是在石油、化工、矿山等存在易燃易爆风险的场景中,防爆位移传感器的性能与可靠性直接关系到生产活动的安全开展。随着工业…

2025年振弦式频率读数仪609供货厂家权威推荐榜单:读数仪609/测读仪读数仪609/土木工程用609读数仪源头厂家精选

在土木工程、大坝监测和矿山安全等领域,振弦式频率读数仪作为核心数据采集设备,其精度与可靠性直接关系到工程安全监测的有效性。其中,609系列读数仪凭借其500-6000Hz的测频范围和0.1Hz的高分辨率,成为行业广泛应用…

2025 年线性位移传感器厂家联系方式推荐,杭州浙达精益提供专业设备与可靠技术支持

行业背景 在工业自动化与精密制造领域,线性位移传感器作为实现精准位置测量的关键设备,其性能直接影响生产流程的稳定性与产品质量的把控。随着我国工业转型升级步伐加快,西气东输、南水北调等重大工程,以及钢铁、…

2025年湖北防撞缓冲车出租渠道权威推荐榜单:防撞缓冲车租赁/出租防撞车/出租防撞缓冲车源头公司精选

在湖北道路施工、市政维护等高危作业场景中,防撞缓冲车已成为保障施工区域人员与设备安全的关键装备。据行业数据显示,2024年我国防撞缓冲车租赁市场规模已突破百亿元,湖北作为中部基建大省,市场需求呈现稳定增长态…

Servlet 国际化 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

直播|均降 40% 的 GPU 成本,大规模 Agent 部署和运维的捷径是什么?

随着 AI 原生浪潮的到来,智能体(Agent)正成为企业创新的新引擎。然而,在生产环境中大规模落地 Agent,却面临开发复杂、运维困难、成本高等挑战。随着 AI 原生浪潮的到来,智能体(Agent)正成为企业创新的新引擎。…

postman 汉化和破~解版来了 (Windows用户进)

【操作方法】 1、下载后解压2、打开压缩包,里面有两个目录,解压app压缩包,打开APP文件夹,3、如果你之前已经安装了postman APP,直接右键查看文件所在位置,进入到其目录下,--【如果没安装,直接看下面5所说】4、…

JavaScript中的闭包:概念与应用

在JavaScript中,闭包是一个非常重要的概念,它不仅是语言的核心特性之一,还在实际开发中广泛应用。本文将深入探讨闭包的定义、工作原理以及一些常见的应用场景,帮助开发者更好地理解和利用闭包。 1. 什么是闭包? …

2025年山东出租履带蜘蛛车平台权威推荐榜单:租赁蜘蛛车/租赁履带蜘蛛车/蜘蛛车出租源头公司精选

在城市建设与工业维护领域,履带蜘蛛车正以其独特的灵活性与稳定性,成为高空作业中不可或缺的设备。山东地区两家领先的租赁服务商,以专业设备与全方位服务助力各类项目高效推进。 在城市化进程持续加速与工业设施维…

2025年商标注册机构权威推荐榜:国内商标、国际商标、图形商标、文字商标全流程服务厂家精选

2025年商标注册机构权威推荐榜:国内商标、国际商标、图形商标、文字商标全流程服务厂家精选 行业背景与发展趋势 随着我国知识产权保护体系的不断完善,商标注册行业正迎来前所未有的发展机遇。据最新数据显示,2024年…

2025年户外面料厂家推荐排行榜:尼龙/涤纶/尼龙格子/珍珠点/登山布/户外速干/瑜伽/梭织/TR消光面料公司推荐

2025年户外面料厂家推荐排行榜:尼龙/涤纶/尼龙格子/珍珠点/登山布/户外速干/瑜伽/梭织/TR消光面料公司推荐 随着户外运动的蓬勃发展和消费者对功能性纺织品需求的不断提升,户外面料行业正迎来新一轮技术革新与市场增…