9 votes

QCheckBox : comment faire la différence entre les changements d'état induits par l'utilisateur et ceux effectués par programme ?

Est-ce que j'ai raté quelque chose ou il n'y a pas vraiment de moyen (prêt / intégré) de changer programmatiquement l'état d'une QCheckBox sans émettre le signal "void stateChanged ( int state )" ?

Le signal mentionné ci-dessus est émis indépendamment du fait que "void setCheckState ( Qt::CheckState state )" ait été appelé ou que l'utilisateur ait changé l'état via l'interface utilisateur, et il n'y a pas de signal "stateEdited" comme avec le QLineEdit.

Donc, s'il n'y a pas de moyen simple de différencier les changements d'état de la QCheckBox qui sont programmés et ceux qui sont induits par l'utilisateur, et que les seules options sont la sous-classification / l'ajout du signal "stateEdited" ou le tripotage de "void QObject::blockSignals( bool block )", pourquoi doit-il en être ainsi, c'est-à-dire, est-ce une (sorte d') incohérence (dans Qt) ?

16voto

TimW Points 5715

Si vous avez seulement besoin d'être informé de l'entrée de l'utilisateur, écoutez

QAbstractButton::clicked( bool checked );

Sinon, connectez-vous à

QAbstractButton::toggled( bool checked );

ou

QCheckBox::stateChanged( int state);

9voto

Marc Mutz - mmutz Points 10367

Une approche qui fonctionne pour tous les signaux et widgets est d'envelopper les appels à setChecked() dans une paire de blockSignals() appels :

const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );

ou, avec quelque chose que tout 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 ); }
};

a RAII classe. Utilisation :

const QSignalBlocker blocker( but );
but->setChecked( true );

MODIFIER 2013-12-10 : Qt 5.3 aura QSignalBlocker intégré.

1voto

Wildcat Points 4786

Si vous voulez

changer programmatiquement l'état d'une QCheckBox

utiliser setCheckState méthode.

P.S. Je ne comprends pas ce que cela veut dire.

changer l'état d'une QCheckBox ... en émettant un signal "void stateChanged ( int state )".

Vous devriez probablement lire Signaux et fentes le sujet plus attentivement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X