旋转框的值,就在它改变之前
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()" 存储它。
所以基本思路是:
- 第一次,接收信号 onValueChanged(value) 并存储值 value_old;
- 下次收到信号时,您可以计算比例!value/value_old;
- 然后你可以发送一个新的信号,或者直接用新值修改对象。
您可以导出您自己的 QSpinBox 版本,包括此代码或在 class 中实现它必须接收信号。这取决于您的架构。
有两种方法可以做到这一点:
- 在变化发生之前捕捉变化并使用事件系统存储旧值(
QKeyEvent
、QMouseEvent
)。这很容易出错,因为 spinBoxWidth
的值可以手动设置。
- 将
spinBoxWidth
的 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
在其 setValue(int)
槽中接收信号并设置适当的值。
我正在使用 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()" 存储它。
所以基本思路是:
- 第一次,接收信号 onValueChanged(value) 并存储值 value_old;
- 下次收到信号时,您可以计算比例!value/value_old;
- 然后你可以发送一个新的信号,或者直接用新值修改对象。
您可以导出您自己的 QSpinBox 版本,包括此代码或在 class 中实现它必须接收信号。这取决于您的架构。
有两种方法可以做到这一点:
- 在变化发生之前捕捉变化并使用事件系统存储旧值(
QKeyEvent
、QMouseEvent
)。这很容易出错,因为spinBoxWidth
的值可以手动设置。 - 将
spinBoxWidth
的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
在其setValue(int)
槽中接收信号并设置适当的值。