У нас есть объект QCheckBox
, когда пользователь проверяет его или удаляет проверку, мы хотим вызвать функцию, поэтому мы подключаем нашу функцию к stateChanged ( int state)
сигнал. С другой стороны, согласно некоторому условию мы также изменяем состояние объекта QCheckBox
внутри кода, и это вызывает нежелательный сигнал.
Есть ли способ предотвратить сигнал стрельбы при определенных условиях?
Вы можете использовать сигнал clicked
, поскольку он генерируется только тогда, когда пользователь фактически щелкает флажок, а не когда вы проверяете его вручную с помощью setChecked
.
Если вы просто не хотите, чтобы сигнал излучался в определенное время, вы можете использовать QObject::blockSignals
вот так:
bool oldState = checkBox->blockSignals(true);
checkBox->setChecked(true);
checkBox->blockSignals(oldState);
Недостаток этого подхода в том, что все сигналы будут заблокированы. Но я думаю, что это не имеет большого значения в случае QCheckBox
.
Вы можете QObject :: disconnect
, чтобы удалить соответствующее соединение сигнального слота, и можете QObject :: connect
снова , как только закончите ...
Вы всегда можете заблокировать передачу сигнала на QObject, используя QObject :: blockSignals ()
. Обратите внимание, что чтобы быть верным, вы должны помнить старое состояние (возвращенное из вызова функции) и восстанавливать его, когда закончите.
На моей работе мы предпочитаем RAII для подобных вещей. Простой класс для этого может выглядеть так:
class SignalBlocker
{
public:
SignalBlocker( QObject *obj ) : m_obj( obj ), m_old( obj->blockSignals( true ) )
{
}
~SignalBlocker()
{
m_obj->blockSignals( m_old );
}
private:
QObject *m_obj;
bool m_old;
};
Edit : Начиная с Qt 5.3, см. QSignalBlocker (h / t к HappyCactus в комментариях)
В классах, производных от QObject
, вы можете вызвать blockSignals (bool)
, чтобы объект не излучал сигналы. Так, например:
void customChangeState(bool checked)
{
blockSignals(true);
ui->checkBox->setCheckState(Qt::Checked);
// other work
blockSignals(false);
}
Вышеупомянутый метод изменит состояние проверки без щелчка, stateChanged
или каких-либо других сигналов.