• 14721阅读
  • 17回复

[提问]lineEdit如何限定输入一个带范围的小数 [复制链接]

上一主题 下一主题
离线alading514
 

只看楼主 倒序阅读 楼主  发表于: 2011-02-28
我想在lineEdit内输入一个带范围的数值
如 我想输入2.00-99.99之间的数值,其他超界数值输入不进去
请问能用什么方式进行限定
我用正则表达式设置过QRegExp reg("[2-9]\.[0-9]{2}|[1-9][0-9]\.[0-9]{2}");
发现仍然可以输入9999这样的数值
离线XChinux

只看该作者 1楼 发表于: 2011-02-28
用doubleSpinBox部件不是更好吗?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线alading514

只看该作者 2楼 发表于: 2011-02-28
doubleSpinBox后边有两个小按键 我不想要 能去掉吗
离线roywillow

只看该作者 3楼 发表于: 2011-02-28
引用第2楼alading514于2011-02-28 14:49发表的  :
doubleSpinBox后边有两个小按键 我不想要 能去掉吗


能去掉的
我记得有QDoubleValidator这种东西存在
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jimmyzhen123
只看该作者 4楼 发表于: 2011-02-28
这个我弄过,给个代码供参考哈。
包含头文件#include<qvalidator.h>
QValidator *myvalidator=new QDoubleValidator(2.00,99.00,2,this);
mylineEditor->setValidator(myvalidator);
这样就可以了。
如果还不清楚可以看看帮助里的QDoubleValidator类。
如果对你有帮助,也帮我看看我的问题。谢谢了。
离线alading514

只看该作者 5楼 发表于: 2011-02-28
引用第4楼jimmyzhen123于2011-02-28 15:30发表的 :
这个我弄过,给个代码供参考哈。
包含头文件#include<qvalidator.h>
QValidator *myvalidator=new QDoubleValidator(2.00,99.00,2,this);
mylineEditor->setValidator(myvalidator);
这样就可以了。
.......

这个跟我用正则表达式效果一样 可以输入999999等数字
[ 此帖被alading514在2011-02-28 16:32重新编辑 ]
离线roywillow

只看该作者 6楼 发表于: 2011-02-28
那就用DoubleSpinBox看看吧,右边的小箭头是能去掉的,参考一下文档
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线alading514

只看该作者 7楼 发表于: 2011-02-28
DoubleSpinBox也可以输入00000000000和“+”号
离线roywillow

只看该作者 8楼 发表于: 2011-02-28
输入00000000000很正常啊,因为它就是个0
+号大概是为了表示正值的意思,因为有可能出现-
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jimmyzhen123
只看该作者 9楼 发表于: 2011-03-01
回 5楼(alading514) 的帖子
这个我以前也遇到过,记得后来是自己写了个槽来解决的。
在这个槽里用了光标移动的信号。
思路是
1,每次光标移动,我就从lineEdit中读取字符窜。
2,将读取的窜转成浮点型。
3,判断:如果是在我要的范围内,则setText()回lineEdit
如果不是则clear()lineEdit。
不知道这次能不能帮到你。哈哈。

离线alading514

只看该作者 10楼 发表于: 2011-03-03
Re:回 5楼(alading514) 的帖子
引用第9楼jimmyzhen123于2011-03-01 13:58发表的 回 5楼(alading514) 的帖子 :
这个我以前也遇到过,记得后来是自己写了个槽来解决的。
在这个槽里用了光标移动的信号。
思路是
1,每次光标移动,我就从lineEdit中读取字符窜。
2,将读取的窜转成浮点型。
.......

这个方法倒是可以,在槽函数里判断数值范围,但是我有很多个LineEdit控件,要写很多个槽,程序很冗长
离线jimmyzhen123
只看该作者 11楼 发表于: 2011-03-03
回 10楼(alading514) 的帖子
你的LineEdit控件的输入值是不是都限制在同一个数值范围内?如果是的话,可以写一个槽大家一起用的。
离线sbtree
只看该作者 12楼 发表于: 2011-03-03
Re:Re:回 5楼(alading514) 的帖子
引用第10楼alading514于2011-03-03 16:59发表的 Re:回 5楼(alading514) 的帖子 :
这个方法倒是可以,在槽函数里判断数值范围,但是我有很多个LineEdit控件,要写很多个槽,程序很冗长

不太理解你的意思。难道你的每一个LineEdit控件都要编写一个类吗?
windows 7 + VC++2008 + Qt4.5.2
离线cjs520
只看该作者 13楼 发表于: 2011-03-04
学习了!!!!
急用钱 找信贷www.h2700.cn 电话13621758639 胡经理
离线jimmyzhen123
只看该作者 14楼 发表于: 2011-03-04
回 12楼(sbtree) 的帖子
不好意思,我可能没说清楚。我的意思是这样的:
如果你的lineEdit控件如果是在同一个类中,那你在这个类中写一个槽,在这个类中的所有lineEdit控件都可以使用这个槽。
离线alading514

只看该作者 15楼 发表于: 2011-03-04
Re:回 12楼(sbtree) 的帖子
引用第14楼jimmyzhen123于2011-03-04 10:27发表的 回 12楼(sbtree) 的帖子 :
不好意思,我可能没说清楚。我的意思是这样的:
如果你的lineEdit控件如果是在同一个类中,那你在这个类中写一个槽,在这个类中的所有lineEdit控件都可以使用这个槽。

那你connect要怎么写 假如有lineEdit1、lineEdit2、。。lineEdit10  每个lineEdit都要connect同一个槽吗 那这个槽怎么写 槽里边不能使用具体的lineEdit1或者lineEdit10吧
我现在lineEdit中的数值范围是不一样的 要怎么做
离线roywillow

只看该作者 16楼 发表于: 2011-03-04
如果每个lineEdit做的事情都是很类似的,一个一个connect独立的槽也不是不可以
也可以只connect一个槽,在这个槽里判断sender()是哪个lineEdit,然后分情况处理
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线sbtree
只看该作者 17楼 发表于: 2011-03-04
Re:Re:回 12楼(sbtree) 的帖子
引用第15楼alading514于2011-03-04 15:15发表的 Re:回 12楼(sbtree) 的帖子 :
那你connect要怎么写 假如有lineEdit1、lineEdit2、。。lineEdit10  每个lineEdit都要connect同一个槽吗 那这个槽怎么写 槽里边不能使用具体的lineEdit1或者lineEdit10吧
我现在lineEdit中的数值范围是不一样的 要怎么做


一个简单的思路:
继承QLineEdit,增加两个变量来分别保存允许的最大值和最小值,再增加一个设定函数,用来设定最大最小值,和一个私有槽进行检验,在构造函数中连接textChanged信号和该私有槽。

注意:小心在槽中更改text,以免造成循环调用
[ 此帖被sbtree在2011-03-04 15:58重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个