c++ - 通过按 Enter 完成编辑后更改或清除对 QLineEdit 的关注,并且仅在 Qt 中发送一个信号

标签 c++ qt

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

当我执行 editingFinished() 并使用 focusNextChild() 或 clearFocus() 为“Enter”重新实现 keyReleaseEvent() 时,我收到两个文本编辑信号,一个是按下“Enter”,另一个是焦点通过 focusNextChild() 或 clearFocus() 进行更改。额外的信号是不需要的。

如果我使用 focusNextChild() 或 clearFocus() 执行 returnPressed() 并为“Enter”重新实现 keyReleaseEvent(),它只会创建一个信号,但我还希望在用户退出 lineEdit 时创建信号tab() 或鼠标单击任何其他行项目,如果我使用 returnPressed() 则不会出现这种情况

理想情况下,我可以在 lineEdit 失去焦点时使用信号,它连接到运行代码的插槽,我可以为“Enter”重新实现 keyReleaseEvent() 来设置焦点,但它看起来不像这样Qt 中存在一个信号。

有没有人对如何实现这个或更好的方法有建议?

最佳答案

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

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

关于c++ - 通过按 Enter 完成编辑后更改或清除对 QLineEdit 的关注,并且仅在 Qt 中发送一个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36019857/

相关文章:

c++ - 窗口的排列顺序

c++ - 从 jpeg 内存缓冲区创建 HBITMAP?

c++ - Doxygen 文档注释#define

c++ - 显式调用 `int` 析构函数 - 为什么需要类型别名?

c++ - 将 QMainWindow 设置在屏幕中央

c++ - 断言 : "allArguments.size() == origArgc"

c++ - 使用 Qt : Invalid conversion from const void* to void* while using QList<Type *const>

c++ - 如果底层 Windows 是 32 位或 64 位版本,如何在正在运行的 C++/Qt 应用程序中进行检测?

c++ - MPI C++ - 排名变化

qt - 在 QtCreator 中调试时如何查看 qDebug 消息