2011-03-04 37 views
0

在我的多个Qt应用程序中,我注意到,无论何时单击菜单栏,调用菜单操作之前,重新发送从GUI中的小部件发送的最后一个信号。大多数时候这并不重要;但在某些场合非常重要。选择菜单动作时发送QWidget信号 - 我如何防止这种情况发生?

在窗口小部件的信号被连接到其自己的时隙中的一个的少数情况下,它是直接地与

if (hasFocus()) 
{ 
    // ... 
} 

开始时隙...块,使得这样的伪信号,而不是由所生成的用户实际上点击小部件,可以忽略。

但是,我最近发现,这种行为是负责几个相关的错误,其中虚假信号在被执行之前通过程序的多个层传递,所以简单地检查特定的小部件是否具有焦点并不是微不足道的执行。

我的问题,因此,是:

  • 为什么在地球上点击菜单项使信号在屏幕上其他地方的一个小部件发出?我无法在任何地方找到这种行为?

  • 我该如何阻止它?

非常感谢,

斯蒂芬。

+1

好的,修复了这个问题... 我GUI上的窗口小部件中有80%是QLineEdit的子类,问题实际上只发生在他们身上。有问题的信号是QLineEdit :: editingFinished(),它根据文档发出“当按下Return或Enter键或线条编辑失去焦点”(我强调)。 – 2011-03-04 10:03:33

+0

问题在于当我按下Enter键时,信号正在发射,然后当小部件失去焦点时再次发出信号。所以我在子类中加入了一些代码来拦截QLineEdit :: editingFinished(),检查自上次发出信号后内容是否发生了变化,并且当且仅当有变化时才转发它。 – 2011-03-04 10:05:38

回答

0

当你演绎自己,QLineEdit::editingFinished信号可以发射两次,如果用户按下进入QLineEdit失去焦点后。一个老bug被创建,但行为没有被改变:https://bugreports.qt.io/browse/QTBUG-40

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

您也可以在接收器对象中进行检查,只是检查该值是否有意义(例如与最后记录的值不同)并处理它。
因此污染信号不会成为问题。在我看来,这是最干净的解决方案,那么你有一个健壮的模型。因为用户也可以用相同的文本值输入几次输入,您必须处理这个。

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

相关问题