在我的多个Qt应用程序中,我注意到,只要单击菜单栏,就会在调用菜单操作之前重新发送从GUI中的窗口小部件发送的最后一个信号。大多数时候这无所谓;但在某些情况下,它非常重要。
在小部件的信号连接到其自己的一个插槽的少数情况下,使用
开始插槽很简单if (hasFocus())
{
// ...
}
...阻止,以便可以忽略用户实际上没有点击小部件而产生的虚假信号。
然而,我最近发现这种行为导致了几个相关的错误,其中虚假信号在被执行之前通过程序的多个层传递,因此简单地检查特定小部件是否具有焦点对于实施
因此,我的问题是:
为什么点击某个菜单项会导致从屏幕上其他位置的小部件发出信号?我无法在任何地方找到这种行为?
我该如何阻止它?
非常感谢,
斯蒂芬。
答案 0 :(得分:0)
正如您自己推断的那样,如果用户按输入并QLineEdit::editingFinished
稍后失去焦点,则QLineEdit
信号可以发出两次。创建了一个旧错误,但行为尚未更改:https://bugreports.qt.io/browse/QTBUG-40。
您的解决方案很好:在触发信号之前,重载QLineEdit并检查值是否已更改。您可以使用标记QLineEdit::isModified
进行检查:它的默认值为false,并且每当用户更改行编辑的内容时都会更改为true 。发射信号时必须手动将其重置为假。
您也可以检查接收器对象,只检查值是否有意义(例如,与上次记录的值不同)并处理它。
因此,污染信号不会成为问题。在我看来,这是最干净的解决方案,然后你就拥有了一个强大的模型。因为用户也可以使用相同的文本值按输入几次,所以无论如何你都必须处理它。
您也可以使用QLineEdit::returnPressed
,但这需要用户始终按Enter键以验证值。并不总是直观但强制用户明确验证输入。