• 21601阅读
  • 9回复

[提问]QLineEdit编辑完,鼠标点击到窗口其他空白地方,如何触发一个信号表示输入完成? [复制链接]

上一主题 下一主题
离线royt
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-30
如题,我有一个Dialog,里面有个QLineEdit,需要对输入值做验证。希望在输入完成且焦点离开时验证,textChanged()信号是肯定不行的,还有个editingFinished()信号,当鼠标点击其他控件或者按tab键时会被发射。但是我希望当鼠标点击Dialog任何空白地方都能触发信号,而此时尽管焦点光标还在QLineEdit中闪动。请问该如何实现呢。

另外,当调用lineEdit->undo()这个函数,我发现它只能回退一次,比如说我现在lineEdit的text()是一个合法值100,我现在输入一个a,再输入一个b,此时验证发现输入不是个合法数字100ab,于是undo操作,但这时会变回100a而不是100。如果回退到最近一次获得焦点时的text() ?
离线royt

只看该作者 1楼 发表于: 2011-08-30
关于第二个undo的问题,自己想了个办法,就是设置一个私有变量,每次LineEdit接受正确的值时,存储到这个变量里面,undo时把该变量的值录入控件。

第一个问题还是没办法,或许要截获鼠标事件,但怎么知道点中的是窗体的空白处呢?
离线wxj120bw

只看该作者 2楼 发表于: 2011-08-30
回 1楼(royt) 的帖子
其实你的验证应该根据文本发生变化实时去验证 不应该根据输入完后来验证 这样你第二个问题应该不会存在 如果你想等输入完才验证 你可以用事件过滤 判断focusoutevent事件
离线royt

只看该作者 3楼 发表于: 2011-08-31
可是focusoutevent不也是当焦点离开lineEdit时发生的吗,当鼠标点击窗口空白处,似乎焦点还在原处。
离线roywillow

只看该作者 4楼 发表于: 2011-08-31
或许可以试试改周围其他组件的focusPolicy来使得line edit强制失去焦点?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 5楼 发表于: 2011-08-31
Re:回 1楼(royt) 的帖子
引用第2楼wxj120bw于2011-08-30 23:34发表的 回 1楼(royt) 的帖子 :
其实你的验证应该根据文本发生变化实时去验证 不应该根据输入完后来验证 这样你第二个问题应该不会存在 如果你想等输入完才验证 你可以用事件过滤 判断focusoutevent事件

installEventFilter ( QObject * )
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线royt

只看该作者 6楼 发表于: 2011-09-05
回 5楼(jdwx) 的帖子
那我试试看吧。
离线royt

只看该作者 7楼 发表于: 2012-03-12
这个问题本来放手了,今天又当bug来修,网上搜索又来到这里,发现居然是自己提问的帖子。
installEventFilter 没啥用处,因为扑捉不到焦点失去,正确的办法是把dialog的focusPolicy设置为mouse click,然后line edit的editfinishing信号就够用了。
离线luna_kiki

只看该作者 8楼 发表于: 2018-11-23
谢谢楼主
离线luna_kiki

只看该作者 9楼 发表于: 2018-11-23
回 royt 的帖子
royt:这个问题本来放手了,今天又当bug来修,网上搜索又来到这里,发现居然是自己提问的帖子。
installEventFilter 没啥用处,因为扑捉不到焦点失去,正确的办法是把dialog的focusPolicy设置为mouse click,然后line edit的editfinishing信号就够用了。 (2012-03-12 16:06) 

虽然已经过去好几年的贴了~ 嘻嘻 
有用~谢谢!
快速回复
限100 字节
 
上一个 下一个