使QSpinBox在输入完整的数据后响应

使QSpinBox在输入完整的数据后响应

  • 问题描述
  • 方法一
  • 方法二

问题描述

Qt的QSpinBoxQDoubleSpinBox两个控件在默认情况下是valueChanged信号,会响应每次输入栏的改变,加入你输入200,valueChanged会在输入2,20,200的时候都会emit,前2次的数据其实是无效的,假如连接的槽函数涉及非常耗时或者界面改变非常明显的操作,这样就不太好了,下面就尝试去解决它。

方法一

我想到的第一种方法就是不使用valueChanged信号,而使用editingFinished信号,这样的话输入栏只会在你按下回车或者把光标移动到别处的时候做出相应(俗称的失去焦点)。似乎是解决了问题,但又出现了另一个问题,点击 上/下 按钮时也不会做出任何相应,这个是我不愿意看到的。解决办法是自己创建一个继承QSpinBox的子类,然后重写鼠标事件和键盘事件来然它能够响应 上/下 按钮的点击。

方法二

这样做有点麻烦,感觉这个功能并不是这么的特殊,Qt不会没有考虑的,然后就在仔细看了文档,看到QAbstractSpinBox类的文档下面有一个setKeyboardTracking()方法,文档是这样写的:
This property holds whether keyboard tracking is enabled for the spinbox.
If keyboard tracking is enabled (the default), the spinbox emits the valueChanged() signal while the new value is being entered from the keyboard.
E.g. when the user enters the value 600 by typing 6, 0, and 0, the spinbox emits 3 signals with the values 6, 60, and 600 respectively.
If keyboard tracking is disabled, the spinbox doesn’t emit the valueChanged() signal while typing. It emits the signal later, when the return key is pressed, when keyboard focus is lost, or when other spinbox functionality is used, e.g. pressing an arrow key.
这不正是我需要的吗,只需要调用setKeyboardTracking(false)方法禁用就可以了,而且 上/下 按钮还是会正常相应。

你可能感兴趣的:(使QSpinBox在输入完整的数据后响应)