QCheckBox: como para diferenciar entre as alterações induzidas pelo utilizador para o estado e aqueles feitos por meio de programação?
Pergunta
Do I perder algo ou não há realmente nenhuma (/ built-in pronto) maneira de programaticamente alterar o estado de um QCheckBox sem emitir o "vazio stateChanged (estado int)" sinal?
O sinal acima mencionado é emitido independentemente de "vazio setCheckState (estado Qt :: CheckState)" foi chamado ou o usuário alterou o estado através da interface do usuário, e não há sinal de "stateEdited" como com o QLineEdit.
Então, se não há nenhuma maneira pronta para diferenciar entre mudanças programáticas e induzida pelo usuário para o estado da QCheckBox, e as únicas opções são subclassificação / adicionar o sinal "stateEdited" ou mexer com "vazio QObject :: blockSignals ( bloco bool)", por que é que isto tem que ser assim, ou seja, é um (uma espécie de) inconsistência (em Qt)?
Solução
Se você só precisa de ser informado de entrada do usuário, ouvir
QAbstractButton::clicked( bool checked );
Caso contrário conectar a
QAbstractButton::toggled( bool checked );
ou
QCheckBox::stateChanged( int state);
Outras dicas
Uma abordagem que funciona para todos os sinais e widgets é envolver as chamadas para setChecked()
em um par de chamadas blockSignals()
:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
ou, com algo cada programador Qt terá em sua caixa de ferramentas:
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 ); }
};
RAII classe. Uso:
const QSignalBlocker blocker( but );
but->setChecked( true );
EDIT 2013/12/10:. Qt 5.3 terá QSignalBlocker built-in
Se você quiser
programaticamente alterar o estado de um QCheckBox
setCheckState método.
P.S. Eu não entendo o que isso significa
alterar o estado de um QCheckBox ... emitindo um "vazio stateChanged (estado int)" sinal
Provavelmente você deve ler Sinais e tópico Slots com mais cuidado.