QCheckBox: comment faire la différence entre les changements induits par l'utilisateur à l'autre et celles faites par programmation?

StackOverflow https://stackoverflow.com/questions/1856544

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)?

Était-ce utile?

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.

scroll top