QLineEdit中editingFinished槽函数会在按下enter时响应两次,分别是按下enter和失去焦点的时候,为了能让 QLineEdit只响应其中一次,需定义一个全局变量m_bFlagEnter保存是否enter是否按下,按下后,则在失去焦点的时候做对应判断,为ture则将m_bFlagEnter复位。为false则说明当前编辑框只是失去了焦点,执行需要做的动作即可。
注意点:当QLineEdit只是失去焦点,当第一次失去焦点时可以响应editingFinished槽函数,但如果这个编辑框中的数据没有做任何变化,则下次失去焦点时,不会响应editingFinished槽函数,这点在官方说明里面没有提及,只有自己测试能发现。只有数据变化了,当失去焦点的时候才能响应editingFinished槽函数
代码如下:
//遍历编辑框,链接同一个槽函数
for each (auto var in ui->tab_MachineParams->findChildren<QLineEdit*>())
{
connect(var, &QLineEdit::editingFinished, this, &qwaGrindProcessFive::slotLineEditFinished);
}
void qwaGrindProcessFive::slotLineEditFinished()
{
//响应编辑框完成
QLineEdit* lineEdit = (QLineEdit*)this->sender();
qDebug() << lineEdit->objectName();
//让finish只响应一次就够了,回车或者失去焦点
if (lineEdit->hasFocus())
{
m_bFlagEnter = true;
//按了回车键
LineEditFinishedAction(lineEdit);
}
else
{
if (!m_bFlagEnter)
{
//失去焦点时
LineEditFinishedAction(lineEdit);
}
else
{
m_bFlagEnter = false;
}
}
}
//编辑框完成时的具体动作
void qwaGrindProcessFive::LineEditFinishedAction(QLineEdit* lineEdit)
{
//响应编辑框完成
if (lineEdit == ui->lineEdit_BaseDistanceX)
{
}
else if (lineEdit == ui->lineEdit_BaseDistanceY)
{
}
else if (lineEdit == ui->lineEdit_BaseDistanceZ)
{
}
}