2012-04-19 185 views
0

假设我有一个QSpinBox,其值为123.45。如果我手动编辑它并开始擦除这五个值,则为值123.4激发valueChanged。如果我继续删除这四个,则会再次发生。QSpinBox ValueChanged被多次触发

而且如果我在完成编辑后按Enter键,它也会被触发。

我想问题是我应该使用void QAbstractSpinBox :: editingFinished()而不是valueChanged,但它看起来像valueChanged是推荐的方法,因为在我的oppinion中有更多的示例ans用法,所以我想确保对这个。

有什么想法?

+0

关于'editingFinished'和'valueChanged'与禁用'keyboardTracking'之间区别的另外一件事情。 只有当焦点丢失时才会发出'editingFinished'。用户可以将焦点设置为'QSpinBox'并开始滚动。如果您在滚动期间需要更新某些内容,请使用'valueChanged'。在大多数情况下,这是最好的方法。 – Vladislav 2017-07-26 10:13:10

回答

0

最后我在Qt文档中找到了keyboardTracking property。易于设置,并且像魅力一样工作!

+3

请在答案中加入一些最低限度的信息,这样人们才能理解,而不必遵循链接。 – HWende 2013-01-30 16:28:22

+3

该链接现在被破坏。尝试http://doc-snapshot.qt-project.org/4.8/qabstractspinbox.html#keyboardTracking-prop。总而言之,从页面开始:如果禁用键盘跟踪,则在键入时spinbox不会发出valueChanged()信号。它稍后发出信号,当按下返回键时,当键盘焦点丢失时,或者当使用其它旋转盒功能时,按箭头键。 – 2013-02-27 11:17:58

+1

额外的皱纹可能会使某人感到困惑。即使使用编辑已完成信号,在MS Visual Studio中调试其处理程序时,它可能会触发两次。一旦按下了返回键,并且如果你设置了一个调试中断,那么处理程序将因焦点更改而再次被调用。 – LRaiz 2014-11-27 16:15:42

0

我认为使用任何一种信号都是好的,几个Qt表单元素同时具有editingFinished????Changed信号。

  • QLineEdit的
  • QAbstractSpinBox亚类:
    • QDateTimeEdit
    • QDoubleSpinBox
    • QSpinBox

的多线只QTextEdit具有textChanged作为按压返回创建一条新线不移动焦点。

0

您可能想要实现一个密钥处理程序,以仅在例如 (例如,回车键被按下。这当然是不一样快的valueChanged() 但它可能是更有效的...

可能看起来像这样

void MyWidget::keyPressEvent(QKeyEvent *event) 
{ 
    int key = event->key(); 

    switch (key) { 
     case Qt::Key_Return: 
     case Qt::Key_Enter: { 
      this->start(); 
      break; 
     } 
     case Qt::Key_Escape: { 
      this->close(); 
      break; 
     } 
     default: 
      QWidget::keyPressEvent(event); 
    } 
} 

你会实现这不是在自己的MySpinBox类, 但在父类。回车键从QSpinBox传递到它的父项,因为它没有被处理。如果该键未由MyWidget处理,则在函数结尾处执行此操作。然后它传递给基类。