【问题标题】:Value of spin box, just before it changes旋转框的值,就在它改变之前
【发布时间】:2016-05-03 10:18:05
【问题描述】:

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

我有:

QSpinBox spinBoxWidth:
QSpinBox spinBoxScale;

我想将spinBoxWidth的信号连接到spinBoxScale,使SpinBoxScale的值始终是“SpinBoxWidth变化后的值”到“其变化前的值”。

(比例 = width_new/width_old)

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

最好的问候

【问题讨论】:

  • 为什么不手动缓存旧值呢?每次更改 spinBoxWidth 时,使用新值/缓存值,然后将缓存值更新为新值。

标签: c++ qt signals slot qspinbox


【解决方案1】:

有两种方法:

  • 在更改发生之前捕获更改并使用事件系统存储旧值(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) 插槽中接收信号并设置适当的值。

【讨论】:

  • 是的,这是个好主意,尽管 ratioChanged 应该发出 "double" 中的值:rationChanged(double)。
  • 啊。您提供的代码有一个常规的 spinbox 作为接收器,而不是 QDoubleSpinBox
  • @JonHarper 你能详细说明一下吗?像你能写出信号/插槽连接吗?为什么onValueChanged() 会被调用?我认为它不是 Qt 类的任何部分的函数。
【解决方案2】:

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

所以基本的想法是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2012-11-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多