旋转框的值,就在它变化之前

时间:2016-05-03 10:18:06

标签: c++ qt signals slot qspinbox

我正在使用qt库写一个代码,我需要在它变化之前获取一个旋转框的值(通过信号)。

我有:

QSpinBox spinBoxWidth:
QSpinBox spinBoxScale;

我想将一个来自spinBoxWidth的信号连接到spinBoxScale,这样SpinBoxScale的值总是“更改后的SpinBoxWidth的值”变为“更改前的值”。

(Scale = width_new / width_old)

我没有在Qt中找到任何插槽,它在更改值时返回旋转框的旧值。我可以以某种方式为此写一个插槽吗?

最好的问候

2 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点:

  • 在更改发生之前捕获更改并使用事件系统(QKeyEventQMouseEvent)存储旧值。这很容易出错,因为spinBoxWidth的值可以手动设置。
  • spinBoxWidth的{​​{1}}信号连接到一个广告位,并引用它所调用的最后一个值。我推荐这种方法。

尝试这样的事情:

valueChanged(int)

连接信号后,流程应如下所示:

  • class MonitoringObject : public QObject { Q_OBJECT int lastValue; int currentValue; ... public Q_SLOTS: void onValueChanged(int newVal) { lastValue = currentValue; currentValue = newVal; if (lastValue == 0) //catch divide-by-zero emit ratioChanged(0); else emit ratioChanged(currentValue/lastValue); } Q_SIGNALS: void ratioChanged(int); 发出spinBoxWidth
  • valueChanged(int)已被调用,其工作并发出MonitoringObject::onValueChanged(int)
  • ratioChanged(int)spinBoxScale广告位中接收信号并设置相应的值。

答案 1 :(得分:0)

我相信在更改之前没有特定的信号值"因为你可以随时存储它来自前一个信号" onValueChanged()"你收到。

所以基本的想法是:

  1. 第一次,接收信号onValueChanged(value)并存储值value_old;
  2. 下次收到信号时,您可以计算出比例!value / value_old;
  3. 然后您可以发送新信号,或直接使用新值修改对象。
  4. 您可以派生自己的QSpinBox版本,包括此代码,或者在必须接收信号的类中实现。这取决于你的架构。