Подход, который работает для всех сигналов и виджетов, - заключить вызовы в 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.