QCheckBox: comment faire la différence entre les changements induits par l'utilisateur à l'autre et celles faites par programmation?
Question
Est-ce que je manque quelque chose ou il n'y a vraiment aucun moyen (prêt / intégré) pour changer l'état d'programmation d'un QCheckBox sans émettre le « vide stateChanged (état int) » signal?
Le signal précité est émis indépendamment du fait que « setCheckState void (Qt :: de l'état CheckState) » a été appelé ou l'utilisateur a changé l'état via l'interface, et il n'y a pas de signal « stateEdited » comme avec le QLineEdit.
Donc, s'il n'y a aucun moyen prêt à différencier les changements programmatiques et induits par l'utilisateur à l'état de la QCheckBox, et les seules options sont sous-classement / ajouter le signal « stateEdited » ou tripoter « vide QObject :: blockSignals ( bloc bool) », pourquoi cela at-il à être, par exemple, est-il un (une sorte de) incohérences (dans Qt)?
La solution
Si vous avez seulement besoin d'être informé de l'entrée utilisateur, écouter
QAbstractButton::clicked( bool checked );
Dans le cas contraire se connecter à
QAbstractButton::toggled( bool checked );
ou
QCheckBox::stateChanged( int state);
Autres conseils
Une approche qui fonctionne pour tous les signaux et les widgets est d'envelopper les appels à setChecked()
dans une paire d'appels blockSignals()
:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
ou, avec quelque chose que chaque programmeur Qt aura dans sa boîte à outils:
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. Utilisation:
const QSignalBlocker blocker( but );
but->setChecked( true );
EDIT 10/12/2013:. Qt 5.3 aura QSignalBlocker intégré
Si vous voulez
changer programatically l'état d'un QCheckBox
setCheckState procédé.
P.S. Je ne comprends pas ce que cela signifie
changer l'état d'un QCheckBox ... émettant un "vide stateChanged (état d'int)" signal
Probablement vous devriez lire signaux et le sujet de machines à sous plus attentivement.