2016-05-03 4 views
1

Я записываю код с использованием qt-библиотек, в котором мне нужно получить значение спин-бокса (по сигналу) непосредственно перед его изменением.Значение столбца спина, непосредственно перед его изменением

У меня есть:

QSpinBox spinBoxWidth: 
QSpinBox spinBoxScale; 

Я хочу подключить сигнал от spinBoxWidth к spinBoxScale, так что значение SpinBoxScale всегда «Значение SpinBoxWidth после изменения», чтобы «его значение перед изменением» ,

(Scale = width_new/width_old)

я не нашел щель в Qt, который возвращает старое значение спина поле при изменении значения. Могу ли я как-то написать для этого слот?

С наилучшими пожеланиями

+0

Почему бы вам просто не кэшировать старое значение вручную? Каждый раз, когда переменная spinBoxWidth изменяется, используйте новое значение/кеш-значение, а затем обновляйте значение кеша до нового значения. –

ответ

2

Есть два способа сделать это:

  • Поймать изменения прежде, чем это произойдет, и сохранить старое значение, используя систему событий (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) и устанавливает соответствующее значение.
+0

Да, это была хорошая идея, хотя ratioChanged должен испускать значение в «double»: rationChanged (double). –

+0

Ах. Ваш предоставленный код имеет регулярную спинбокс в качестве приемника, а не 'QDoubleSpinBox'. –

0

Я считаю, что нет никакого конкретного сигнала на «значение до изменения», потому что вы всегда можете хранить его от предыдущего сигнала «onValueChanged()» вы получили.

Так основная идея будет:

  1. первый раз, получают сигнал onValueChanged (значение) и сохранить значение value_old;
  2. В следующий раз, когда вы получите сигнал, вы можете вычислить значение scale! Value/value_old;
  3. Затем вы можете отправить новый сигнал или напрямую изменить объект с новым значением.

Вы можете получить собственную версию QSpinBox, включая этот код или реализованный в классе, который должен получить сигнал. Это зависит от вашей архитектуры.

Смежные вопросы