QML中TextField如何同时使用RegExpValidator与输入掩码?
QML TextField 纬度输入掩码与正则校验共存方案
两者无法同时生效的核心原因是初始配置的掩码和正则规则完全不匹配:输入掩码会自动向文本中插入°、′这类固定格式符,但原有正则只匹配纯数字与点组成的字符串,没有把格式符纳入匹配范围,自然会一直判定输入非法。按以下步骤调整即可正常使用:
- 修正输入掩码,对齐度分格式规则
把原有掩码替换为"#00\u00B009.9999\u2032;_",各段含义:- 开头
#:匹配可选的正负号(+/-),留空默认代表正纬度 00:两位度数值位,支持0-90的度值输入,可选位兼容1位度值的输入场景\u00B0:固定插入度符号°,无需用户手动输入09:两位分整数位,限制输入范围00-59- 固定
.:分位的小数点 9999:四位分小数位,强制保留四位精度\u2032:固定插入分符号′- 末尾
;_:设置占位符为下划线,避免默认空格干扰校验逻辑
- 开头
- 修正正则表达式,匹配带格式符的完整文本
把原有正则替换为/^[+-]?(([0-8]?\d)\u00B0([0-5]\d\.\d{4})\u2032|90\u00B000\.0000\u2032)$/,规则完全对齐纬度合法范围:- 支持开头可选的正负号
- 匹配0-89度区间的任意值,分位限制在00.0000-59.9999之间
- 单独匹配90度极点值,仅允许90°00.0000′的合法输入
- 把掩码自动插入的°、′符号纳入匹配范围,避免格式符导致校验失败
- 组件配置示例
直接在TextField中同时挂载调整后的掩码和校验器即可,二者不会冲突:TextField { id: latInput placeholderText: "输入示例:+39°54.2673′" inputMask: "#00\u00B009.9999\u2032;_" validator: RegExpValidator { regExp: /^[+-]?(([0-8]?\d)\u00B0([0-5]\d\.\d{4})\u2032|90\u00B000\.0000\u2032)$/ } // 可选:扩展属性直接获取转好的十进制度数值 property real decimalLat: { if (!acceptableInput) return NaN const cleanTxt = text.replaceAll("_", "") const [degStr, minStr] = cleanTxt.split("\u00B0") const deg = parseFloat(degStr || "0") const min = parseFloat(minStr.replace("\u2032", "")) return deg + min / 60 } onEditingFinished: { if (acceptableInput) console.log("输入合法,十进制度值:", decimalLat) } } - 注意事项
- 输入过程中不要强制拦截提示,掩码是逐位填充的,用户输入未完成时文本自然不满足完整正则,监听
acceptableInput属性或editingFinished信号做后续逻辑即可 - 不要修改掩码中固定格式符的顺序,否则会和正则匹配规则错位导致校验失效
- 输入过程中不要强制拦截提示,掩码是逐位填充的,用户输入未完成时文本自然不满足完整正则,监听
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

