Предотвращение сигналов запуска в Qt

У нас есть объект QCheckBox , когда пользователь проверяет его или удаляет проверку, мы хотим вызвать функцию, поэтому мы подключаем нашу функцию к stateChanged ( int state) сигнал. С другой стороны, согласно некоторому условию мы также изменяем состояние объекта QCheckBox внутри кода, и это вызывает нежелательный сигнал.

Есть ли способ предотвратить сигнал стрельбы при определенных условиях?

52
задан Angie Quijano 14 April 2016 в 07:33
поделиться

4 ответа

Вы можете использовать сигнал clicked , поскольку он генерируется только тогда, когда пользователь фактически щелкает флажок, а не когда вы проверяете его вручную с помощью setChecked.

Если вы просто не хотите, чтобы сигнал излучался в определенное время, вы можете использовать QObject::blockSignals вот так:

bool oldState = checkBox->blockSignals(true);
checkBox->setChecked(true);
checkBox->blockSignals(oldState);

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

78
ответ дан 7 November 2019 в 09:04
поделиться

Вы можете QObject :: disconnect , чтобы удалить соответствующее соединение сигнального слота, и можете QObject :: connect снова , как только закончите ...

14
ответ дан 7 November 2019 в 09:04
поделиться

Вы всегда можете заблокировать передачу сигнала на 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 в комментариях)

36
ответ дан 7 November 2019 в 09:04
поделиться

В классах, производных от QObject , вы можете вызвать blockSignals (bool) , чтобы объект не излучал сигналы. Так, например:

void customChangeState(bool checked)
{
    blockSignals(true);
    ui->checkBox->setCheckState(Qt::Checked);
    // other work
    blockSignals(false);
}

Вышеупомянутый метод изменит состояние проверки без щелчка, stateChanged или каких-либо других сигналов.

6
ответ дан 7 November 2019 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: