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)"
вероятно, следует читать сигналы и слоты тему более тщательно.