通过按 Enter 完成编辑时更改或清除 QLineEdit 上的焦点,并在 Qt 中仅发送一个信号

Change or clear focus on QLineEdit when done editing by pressing Enter and only send one signal in Qt

本文关键字:Qt 并在 一个 信号 焦点 编辑 Enter QLineEdit 清除      更新时间:2023-10-16

我想创建一种行为,在这种行为中,当我完成文本编辑时,焦点要么移动到下一个子项,要么在我按"Enter"时清除当前字段上的焦点。然后我会得到一个信号来触发代码的一部分。

当我使用 focusNextChild() 或 clearFocus() 为 "Enter"

重新实现 keyReleaseEvent() 时,我得到两个文本编辑信号,一个是按下"Enter",另一个是通过 focusNextChild() 或 clearFocus() 更改焦点时。 额外的信号是不可取的。

如果我使用 focusNextChild() 或 clearFocus() 为 "Enter" 重新实现 keyReleaseEvent(),它只会创建一个信号,但我也希望在用户通过 tab() 退出 lineEdit 或鼠标单击任何其他行项目时创建信号,如果我使用 returnPressed() 则不会如此

理想情况下,当 lineEdit 失去焦点时,我可以使用信号,它连接到运行代码的插槽,我可以重新实现 keyReleaseEvent() for "Enter" 来设置焦点,但似乎 Qt 中不存在这样的信号。

有没有人对如何实施这一点或更好的方法提出建议?

您可以根据需要连接/断开信号。例如,当您在QLineEdit中聚焦时,您可以将列出的两个信号连接到插槽,这将断开这两个连接并将焦点移动到下一个子项。因此,您将只处理一个信号。

另一种解决方案 - 您可以在插槽的开头调用QLineEdit.blockSignals(true),并在插槽的末尾调用QLineEdit.blockSignals(false)。在这种情况下,无论您在插槽中做什么,您都不会在QLineEdit中触发任何信号,也不会产生重复。