QLineEdit正确发射editingFinished信号问题

QLineEdit正确发射editingFinished信号问题

开发时,遇到这样一条需求,编辑框内可输入温度值,温度值范围为30.0-45.0。
控件使用QLineEdit,使用正则表达式限制输入。代码如下:

QRegExp rx("^[3][0-9][\.][0-9]|[4][0-4][\.][0-9]|[4][5][\.][0]$");
QRegExpValidator *pReg = new QRegExpValidator(rx, this);
ui.m_pTempLineEdit->setValidator(pReg);

使用该正则表达式的结果为:限制了第一位只能输入3、4,当第一位是3时,第二位可输入0-9的数字,小数点,小数点后一位范围为0-9,当第一位是4时,第二位可输入0-4的数字,小数点,小数点后一位范围为0-9,当第一位是4时,第二位输入5时,输入小数点,小数点后只能输入0。

使用这个正则表达式后,输入两位数如35,输入带一位小数的两位数如38.6,输入45时小数点后只能输入0,这些功能均能覆盖满足,但仍有其他问题,比如只输入第一位数3或4后,就完成编辑,点击其他搜索条件或搜索按钮,此时编辑框内的值是3或4,显然不在30.0-45.0的范围内。

因此,想把编辑框改成完成编辑时,能够补充后面未输入的数字,这样就不会出现上述错误的情况,如输入3后,点击其他条件完成该编辑框的编辑,此时编辑框内能够自动补充更正为30.0,输入42后,点击其他条件完成该编辑框的编辑,此时编辑框内能够自动补充更正为42.0,输入45.,其他条件完成该编辑框的编辑,此时编辑框内能够自动补充更正为45.0。

寻找可行的方法来实现上述交互过程。当输入框失去焦点时能够发射出editingFinished()信号,连接该信号,在信号槽中将QLineEdit控件里的字符补充完整再显示。代码如下:

connect(ui.m_pTempLineEdit, &QLineEdit::editingFinished, this, &CDlg::onDealText);

void CDlg:: onDealText ()
{
        float fTemp = (ui.m_pTempLineEdit->text()).toFloat();
        if (fTemp < 30.0)
        {
            QString strTemp = QString::number(fTemp * 10, 'f', 1);
            ui.m_pTempLineEdit->setText(strTemp);
        }
        else
        {
            QString strTemp = QString::number(fTemp, 'f', 1);
            ui.m_pTempLineEdit->setText(strTemp);
        }
}

经调试,发现输入3时,点击其他控件让该编辑框失去焦点后并未触发该信号槽。获取到的温度信息仍为3,并不是30.0。

查询Qt手册editingFinished()信号的说明:
This signal is emitted when the Return or Enter key is pressed or the line edit loses focus. Note that if there is a validator() or inputMask() set on the line edit and enter/return is pressed, the editingFinished() signal will only be emitted if the input follows the inputMask() and the validator() returns QValidator::Acceptable.
可以得知,当QLineEdit控件set了validator后,需要接收到其返回的QValidator::Acceptable值后,失去焦点时才会发射该信号,而刚刚的正则表达式输入3后并未完全匹配输入,属于未输入完状态,不会返回QValidator::Acceptable状态,因此没有发射该信号,槽函数也未被触发。

修改正则表达式为:

QRegExp rx("^[3]|[3][0-9]|[3][0-9][\.]|[3][0-9][\.][0-9]|[4]|[4][0-4]|[4][0-4][\.]|[4][0-4][\.][0-9]|[4][5]|[4][5][\.]|[4][5][\.][0]$");

此时,只输入第一位3后按回车或点击其他编辑框,满足此正则表达式,QLineEdit发射editingFinished信号,触发槽函数,槽函数中会将编辑框中文字自动更改为30.0,达到理想的效果和要求。更改正则表达式后,无论输入3、4、32、33.等类似结构的数值时,均可补充为小数点后1位的浮点数形式显示。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值