Лучшая практика для QT, обновляющая значения сигналов/слотов

Что вы считаете лучшей практикой проектирования взаимодействия сигнала/слота для обновления значений элементов в классе?

Например, рассмотрим переменную-член, представленную в пользовательском интерфейсе. Пользователь изменяет значение в пользовательском интерфейсе. Отношение сигнал/слот существует для автоматического обновления переменной-члена с помощью функции обновления переменной-члена.

Мы также хотим, чтобы изменения в переменной-члене автоматически обновлялись в пользовательском интерфейсе, чтобы связь сигнал/слот была обратной. При обновлении переменной-члена с помощью функции обновления сигнал запускает обновление пользовательского интерфейса.

Как не допустить, чтобы они стали круговыми? Это так же просто, как сверка нового значения с текущим значением при вызове функции обновления переменной-члена и отправка сигнала для обновления пользовательского интерфейса только при наличии разницы?

Или... есть ли более элегантный способ сделать это?


person mike    schedule 15.08.2013    source источник
comment
Возможно, вам следует рассмотреть Q_PROPERTY и NOTIFY.   -  person lpapp    schedule 16.08.2013


Ответы (1)


Как не допустить, чтобы они стали круговыми? Это так же просто, как сверка нового значения с текущим значением при вызове функции обновления переменной-члена и отправка сигнала для обновления пользовательского интерфейса только при наличии разницы?

да.

Говоря прагматически, это позволяет вам подключить, скажем, QDial, QSpinBox и QSlider и заставить их синхронизироваться, не требуя от вас дополнительной магии для предотвращения бесконечных циклов.

С точки зрения семантики, вы заметили, что типичный сигнал при изменении значения называется valueChanged?

void myClass::setValue(int value) {
    if (m_value != value) {
        m_value = value;
        emit valueChanged(value); // YES, THE VALUE *DID* CHANGE!
    }
}

Это означает, что сигнал не должен быть испущен, если значение не изменилось, что и происходит, если вы пытаетесь установить значение на текущее - либо установив его напрямую, либо через вызов сигнала/слота.

person peppe    schedule 15.08.2013