前言

最近做了一个小的上位机,要通过串口来下发几个时间参数,为了防止误输入,产生不必要的麻烦,我把输入范围限制在0-680的浮点型数据,支持小数点后2位。学习了一下QLineEdit类是如何限制输入类型的。本来是想写一个函数,在下发参数时,传QLineEdit的字符串参数进去,然后判断是否合法,如果不合法,则不下发参数,请用户修改后再确认。这么做也实现了,但是想Qt这么强大,应该会考虑到这一点的,所以找了个更简单,在输入的时候就限制数据的类型,不合法的根本输入不进去。

关于QLineEdit类

QlineEdit是一个单行文本输入框,支持撤销、重做、复制、粘贴、拖放等操作,echomode模式支持,即只写模式,可以输入密码等不可见的文本,官方介绍:QLineEdit Class

可以通过setValidator函数来限制数据类型,

setValidator函数的参数是QValidator,主要有3种:

  • QIntValidator //限制只能输入整数,限制范围
  • QDoubleValidator //限制只能输入浮点数,包括范围,小数点位数
  • QRegExpValidator //限制规则按指定的正则表达式

Amazing!QDoubleValidator不就是我想要的吗?但是经过实际测试发现,其中QDoubleValidator可以限制浮点型数据和输入的小数位数,但是并不能限制输入范围,也就是setRange,setBottom,setTop这些函数的设置并没有生效,这难道是Qt的一个Bug?我的Qt版本是5.8.0,Qt Creator版本是4.2.1,而QRegExpValidator的使用就很强大了,需要了解正则表达式的相关知识。下面来详细介绍一下这三种类的使用。

QIntValidator Class

  • 功能

    限制QLineEdit只能输入int类型数据,即整型数据,包含正负整数和0

  • 相关函数

    //限制数据范围
    QIntValidator(int minimum, int maximum, QObject *parent = Q_NULLPTR)
    //获取最小值
    int bottom()
    //设置最小值
    void setBottom(int)
    //设置数据范围
    void setRange(int bottom, int top)
    //设置最大值
    void setTop(int)
    //获取最大值
    int top() const
  • 示例

    //整型限制范围100-999
    lineEdit->setValidator(new QIntValidator(100, 999, this));       //或者
    QIntValidator* aIntValidator = new QIntValidator;
    aIntValidator->setRange(100, 999);
    ui->le_L1->setValidator(aIntValidator);

QDoubleValidator Class

  • 功能

    限制QLineEdit只能输入浮点型数据,可以指定输入范围及小数点位数

  • 相关函数

    //限制数据范围
    QDoubleValidator(double bottom, double top, int decimals, QObject *parent = Q_NULLPTR)
    //设置小数点位数
    void setDecimals(int)
    //获取设置的小数点位数
    int decimals()
    //设置数字表示方式,标准计数法还是科学计数法
    void setNotation(Notation)
    //获取设置的计数方式
    Notation notation()
    //设置最小值
    void setBottom(double)
    //获取设置的最小值
    double bottom()
    //设置最大值
    void setTop(double)
    //获取设置的最大值
    double top()
    //设置数据范围,默认无小数位
    void setRange(double minimum, double maximum, int decimals = 0)
    
  • 示例

//限制范围0-680,小数点2位
lineEdit->setValidator(**new** QDoubleValidator(0,680,2,**this**));

限制范围无效,这可能是Qt的一个Bug。

QRegExpValidator Class

  • 功能

    按照自定义的正则表达式规则,限制输入的范围。

  • 相关函数

//设置按正则表达式限制
QRegExpValidator(const QRegExp &rx, QObject *parent = Q_NULLPTR)
//获取设置的正则表达式
QRegExp &regExp()
//设置正则表达式
void setRegExp(const QRegExp &rx)
  • 示例
//限制-180,180,并限定小数点后4位
QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d{1,4})?)$");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
lineEdit->setValidator(pReg);  

关于正则表达式

正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

关于正则表达式的详细介绍:正则表达式30分钟入门教程

//正则表达式说明:
/*^(-?[0]|-?[1-9][0-9]{0,5})(?:\.\d{1,4})?$|(^\t?$)
(^-?180$)|(^-?1[0-7]\d$)|(^-?[1-9]\d$)|(^-?[1-9]$)|^0$
^-?(180|1?[0-7]?\d(\.\d+)?)$
^-?(180|1?[0-7]?\d(\.\d{1,4})?)$
^-?(90|[1-8]?\d(\.\d{1,4})?)$式子中开头的^和结尾的$限定字符串的开始和结尾;"-?" 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;管道符“|”表示平行分组,比如后三个,表示180或其它形式;[1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;"\d"是一个转义字符,表示匹配一位数字;“\.” 表示匹配小数点;"\d+",这里面的+表示其前面的\d重复一次或多次;"\d{1,4}",里面的{1,4}表示重复1到4次;*/

关于QDoubleValidator的Bug解决

网上搜索一遍,确实是Qt的Bug,需要重写,下面是一个网友实现的MyDoubleValidator类。

  • 定义MyDoubleValidator类
class MyDoubleValidator : public QDoubleValidator
{Q_OBJECT
public:MyDoubleValidator(QObject *parent);~MyDoubleValidator();virtual QValidator::State validate(QString &input, int &pos) const;
};
  • 函数实现
#include "MyDoubleValidator.h"MyDoubleValidator::MyDoubleValidator(QObject *parent): QDoubleValidator(parent)
{
}MyDoubleValidator::~MyDoubleValidator()
{
}QValidator:: State MyDoubleValidator::validate(QString & input, int & pos) const
{if (input.isEmpty()){return QValidator::Intermediate;}bool OK = false;double val = input.toDouble(&OK);if (!OK){return QValidator::Invalid;}int dotPos = input.indexOf(".");if (dotPos > 0){if (input.right(input.length() - dotPos - 1).length() > decimals()){return QValidator::Invalid;}}if(val<bottom()|| val>top())return QValidator::Invalid;return QValidator::Acceptable;
}
  • 实际应用
{MyDoubleValidator * dv = new  MyDoubleValidator(0);dv->setNotation(QDoubleValidator::StandardNotation);dv->setRange(2.0, 3.0, 2);ui.lineEdit->setValidator(dv);
}

自定义函数的实现方式

一开始,我并不知道可以通过setValidator函数来实现数据类型限制,我直接实现了一个检测输入的QString类型数据是否是Float数据,并没有指定小数后的位数,返回值为1表示是Float类型数据,否则不是。

  • 函数实现
int Dialog::FloatCheck(QString float_str)
{QByteArray ba = float_str.toLatin1();//QString 转换为 char*const char *str = ba.data();int dotNum = 0;int dotIdx = 0;int Idx = 0;while(*str){Idx++;if(*str == '.'){dotIdx = Idx;   //dotdotNum++;       //dot个数统计if(dotNum > 1)  //小数点个数超过1return 0;else if((dotNum == 0 && dotIdx) || (dotNum == 1 && dotIdx == 1))    //无小数点{return 1;}}if(*str != '.'){if(*str < '0' || *str > '9')return 0;}str++;}return 1;
}
  • 测试验证
/*输入:char *str1 = "1.2345";char *str2 = "a.2345";char *str3 = "0.2345";char *str4 = "1a2345";char *str5 = "a2345";char *str6 = "1.2.2345";char *str7 = "3.234.";char *str8 = "3.234.a";输出:str1 : 1.2345 - 1
str2 : a.2345 - 0
str3 : 0.2345 - 1
str4 : 1a2345 - 0
str5 : a2345 - 0
str6 : 1.2.2345 - 0
str7 : 3.234. - 0
str8 : 3.234.a - 0*/

历史精选

  • Qt实现软件自动更新的一种简单方法
  • Qt小项目之串口助手控制LED
  • 真正的RISC-V开发板——VEGA织女星开发板开箱评测
  • 手把手教你制作Jlink-OB调试器(含原理图、PCB、外壳、固件)

欢迎关注我的个人博客:www.wangchaochao.top

或微信扫码关注我的公众号

转载于:https://www.cnblogs.com/whik/p/11078650.html

QLineEdit限制数据类型——只能输入浮点型数相关推荐

  1. Qt 设置只能输入英文和数字

    头文件 //.h文件#ifndef DIALOG_H #define DIALOG_H#include <QDialog>namespace Ui { class Dialog; }cla ...

  2. qlineedit只能输入数字_Qt编写自定义控件51-可输入仪表盘

    一.前言 这个控件是近期定制的控件,还是比较实用的控件之一,用户主要是提了三点需求,一点是切换焦点的时候控件放大突出显示,一点是可直接输入或者编辑值,还有一点是支持上下键及翻页键和鼠标滚轮来动态修改值 ...

  3. Qt实用技巧:实用掩码限制QLineEdit只能输入规定长度的数字、字母和字符

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113030404 长期持续带来更多项目与技术分 ...

  4. Qt实用技巧:QLineEdit限制只能输入Ip地址,且一直显示ip地址分段的“.”

    若该文为原创文章,未经允许不得转载 原博主博客地址::http://blog.csdn.net/qq21497936 原博主博客导航:http://blog.csdn.net/qq21497936/a ...

  5. C语言-03-基本数据类型及输入输出函数

    C语言基本数据类型及输入输出函数 基本数据类型: 整型类型: 基本类型(整数)int型: 短整型() 长整型 双长整型 字符型 布尔型 浮点类型(小数) 单精度浮点型 双精度浮点型 复数浮点型 C语言 ...

  6. 限制input框只能输入0~100的正整数

    法一:(复杂) <input type="number" oninput="if(!/^[0-9]+$/.test(value)) value=value.repl ...

  7. access中本年度的四月一日_access某表时间字段里的有效性规则为只能输入系统日期前一年五月一日(含)以前的日期,如何设置表达式?...

    展开全部 有效性规则为只能输入系统日62616964757a686964616fe58685e5aeb931333431376532期前一年五月一日(含)以前的日期设置表达式: "有效性规则 ...

  8. html表单设置只是数字,antd form设置只能输入数字

    Antd form提供了强大的验证,并且支持自定义验证,到底有多少种方法设置输入框只能输入数字呢? normalize normalize:(value)=>newValue; 复制代码 这个方 ...

  9. php 判断只能是数字和字母,PHP_JS只能输入数字或数字和字母等的正则表达式,JS判断只能是数字和小数点 0. - phpStudy...

    JS只能输入数字或数字和字母等的正则表达式 JS判断只能是数字和小数点 0.不能输入中文 1) 2) function chkIt(frm){ if (frm.n1.value.length>0 ...

最新文章

  1. 举个栗子看如何做MySQL 内核深度优化
  2. Scrapy框架的学习(6.item介绍以及items的使用(提前定义好字段名))
  3. Java web对试卷进行单选多选答题进行打分_2020年大学慕课Java程序设计作业答案...
  4. Dapr + .NET 实战(十四)虚拟机集群部署 mDNS + Consul
  5. 瞬间读懂什么是互联网思维、大数据、O2O、众筹、红海
  6. 高铁车厢女童突然抽搐 护士为防其咬舌将手指放口中
  7. 腾控Multiprog 使用问题 (持续更新)
  8. 漏洞复现永恒之蓝MS-17010+修复
  9. hive 求两个月之间的时间间隔(月留存)
  10. 智能人物画像综合分析系统 6.29
  11. 我就知道肯定有人想要这个
  12. Nvidia Agx Xavier平台nvp6324模块调试
  13. 痞子衡嵌入式:聊聊i.MXRT1170上串行NOR Flash双程序可交替启动设计
  14. 你该用什么的美剧学英语?
  15. java excel导出 jxl_JAVA利用JXL导出/生成 EXCEL
  16. 网络安全等级保护测评高风险判定
  17. 【CodeForces】CF3B Lorry
  18. 新闻周刊文字内容_新闻周刊解说词
  19. lua版本base64加密和解密
  20. IMCART外贸开源B2C网店系统下载

热门文章

  1. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance 模拟
  2. Crontab中shell每分钟执行一次HDFS文件上传不执行的解决方案
  3. IBM HTTP Server Websphere Plugin
  4. 【物联网智能网关-03】GPRS模块中文短信收发
  5. YFIOServer 后台IO接口使用说明
  6. 大数据组件需要额外添加的依赖包汇总(持续更新中)
  7. kaggle颅内出血比赛分析
  8. Exception in thread main java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
  9. 获取python包的路径
  10. oracle实验使用游标,Oracle数据库实验-PLSQL游标、过程、函数、包的使用