选择菜单操作时发送的QWidget信号 - 如何防止这种情况?

时间:2011-03-04 01:07:43

标签: qt menu focus signals-slots

在我的多个Qt应用程序中,我注意到,只要单击菜单栏,就会在调用菜单操作之前重新发送从GUI中的窗口小部件发送的最后一个信号。大多数时候这无所谓;但在某些情况下,它非常重要。

在小部件的信号连接到其自己的一个插槽的少数情况下,使用

开始插槽很简单
if (hasFocus())
{
    // ...
}

...阻止,以便可以忽略用户实际上没有点击小部件而产生的虚假信号。

然而,我最近发现这种行为导致了几个相关的错误,其中虚假信号在被执行之前通过程序的多个层传递,因此简单地检查特定小部件是否具有焦点对于实施

因此,我的问题是:

  • 为什么点击某个菜单项会导致从屏幕上其他位置的小部件发出信号?我无法在任何地方找到这种行为?

  • 我该如何阻止它?

非常感谢,

斯蒂芬。

1 个答案:

答案 0 :(得分:0)

正如您自己推断的那样,如果用户按输入QLineEdit::editingFinished稍后失去焦点,则QLineEdit信号可以发出两次。创建了一个旧错误,但行为尚未更改:https://bugreports.qt.io/browse/QTBUG-40

您的解决方案很好:在触发信号之前,重载QLineEdit并检查值是否已更改。您可以使用标记QLineEdit::isModified进行检查:它的默认值为false,并且每当用户更改行编辑的内容时都会更改为true 。发射信号时必须手动将其重置为假。

您也可以检查接收器对象,只检查值是否有意义(例如,与上次记录的值不同)并处理它。
因此,污染信号不会成为问题。在我看来,这是最干净的解决方案,然后你就拥有了一个强大的模型。因为用户也可以使用相同的文本值按输入几次,所以无论如何你都必须处理它。

您也可以使用QLineEdit::returnPressed,但这需要用户始终按Enter键以验证值。并不总是直观但强制用户明确验证输入。