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

Value of spin box, just before it changes

本文关键字:旋转      更新时间:2023-10-16

我正在使用qt库编写一段代码,其中我需要在旋转框更改之前(通过信号)获得它的值。

我有:

QSpinBox spinBoxWidth:
QSpinBox spinBoxScale;

我想把一个信号从spinBoxWidth连接到spinBoxScale,这样spinBoxScale的值总是"更改后spinBoxWidth的值"到"更改前的值"。

(比例=width_new/width_old)

我在Qt中找不到任何在更改值时返回旋转框旧值的插槽。我能为它写一个空位吗?

向致以最诚挚的问候

有两种方法:

  • 在更改发生之前捕获它,并使用事件系统(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)
  • CCD_ 10在其CCD_

最简单的方法可能是使用lambda缓存valueChanged的值以供下一次调用:

auto const width = new QSpinBox();
width->setValue(200);
connect(width, &QSpinBox::valueChanged,
    [prev_value = width->value()](int const value) mutable {
        auto const scale = double(value) / double(prev_value);
        // do stuff
        prev_value = value;
    });

我相信"更改前的值"没有特定的信号,因为您总是可以从收到的上一个信号"onValueChanged()"中存储它。

所以基本的想法是:

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

您可以派生自己版本的QSpinBox,包括此代码,也可以在它必须接收信号的类中实现。这取决于您的体系结构。