1

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

我有:

QSpinBox spinBoxWidth:
QSpinBox spinBoxScale;

我想将一个信号从 spinBoxWidth 连接到 spinBoxScale,以便 SpinBoxScale 的值始终是“更改后 SpinBoxWidth 的值”到“更改前的值”。

(比例 = width_new/width_old)

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

最好的祝福

4

2 回答 2

3

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

  • 在更改发生之前捕获更改并使用事件系统 ( QKeyEvent, QMouseEvent) 存储旧值。这很容易出错,因为spinBoxWidth可以手动设置 的值。
  • ConnectspinBoxWidthvalueChanged(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)插槽中接收信号并设置适当的值。
于 2016-05-03T10:50:36.420 回答
0

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

所以基本的想法是:

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

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

于 2016-05-03T10:37:30.713 回答