QCheckBox: как различать пользовательские изменения состояния и изменения, сделанные программно?

Я что-то пропустил или действительно нет (готового / встроенного) способа программно изменить состояние QCheckBox без испускания сигнала "void stateChanged ( int state)"?

вышеупомянутый сигнал излучается независимо от того, был ли вызван" void setCheckState ( Qt::checkstate state) "или пользователь изменил состояние через пользовательский интерфейс, и нет сигнала" stateEdited", как с QLineEdit.

Итак, если нет готового способа дифференцировать между программными и пользовательскими изменениями состояния QCheckBox, и единственными вариантами являются подклассы / добавление сигнала "stateEdited" или возня с "void QObject::blockSignals( bool block )", Почему это должно быть так, т. е. это (своего рода) несоответствие (в Qt)?

3 ответов


Если вам нужно только быть информированным о вводе пользователя, слушайте

QAbstractButton::clicked( bool checked );

в противном случае подключаться к

QAbstractButton::toggled( bool checked );

или

QCheckBox::stateChanged( int state);

подход, который работает для всех сигналов и виджеты обернуть вызовы setChecked() в паре blockSignals() вызовы:

const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );

или с чем-то, что каждый программист Qt будет иметь в своем наборе инструментов:

class QSignalBlocker {
    QObject * const o;
    const bool blocked;
public:
    explicit QSignalBlocker( QObject * o )
      : o( o ),
        blocked( o && o->signalsBlocked() )
    {
        if ( o ) o->blockSignals( true );
    }
    ~QSignalBlocker() { if ( o ) o->blockSignals( blocked ); }
};

a RAII класса. Использование:

const QSignalBlocker blocker( but );
but->setChecked( true );

изменить 2013-12-10: Qt 5.3 будет иметь встроенный QSignalBlocker.


Если вы хотите

программно измените состояние QCheckBox

использовать setCheckState метод.

P. S. Я не понимаю, что значит

измените состояние QCheckBox ... испуская сигнал" void stateChanged ( int state)"

вероятно, следует читать сигналы и слоты тему более тщательно.