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

Value of spin box, just before it changes

我正在使用 qt 库编写代码,其中我需要在旋转框发生变化之前获取旋转框的值(通过信号)。

我有:

QSpinBox spinBoxWidth:
QSpinBox spinBoxScale;

我想将一个信号从 spinBoxWidth 连接到 spinBoxScale,这样 SpinBoxScale 的值总是 "the Value of SpinBoxWidth after changing" 到 "its value before changing"。

(比例=width_new/width_old)

我在 Qt 中没有找到任何插槽 returns 在更改值时旋转框的旧值。我可以为此写一个插槽吗?

此致

我相信 "value before change" 没有特定的信号,因为您始终可以根据收到的前一个信号 "onValueChanged()" 存储它。

所以基本思路是:

  1. 第一次,接收信号 onValueChanged(value) 并存储值 value_old;
  2. 下次收到信号时,您可以计算比例!value/value_old;
  3. 然后你可以发送一个新的信号,或者直接用新值修改对象。

您可以导出您自己的 QSpinBox 版本,包括此代码或在 class 中实现它必须接收信号。这取决于您的架构。

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

  • 在变化发生之前捕捉变化并使用事件系统存储旧值(QKeyEventQMouseEvent)。这很容易出错,因为 spinBoxWidth 的值可以手动设置。
  • spinBoxWidthvalueChanged(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 在其 setValue(int) 槽中接收信号并设置适当的值。