QCheckBox: come differenziare tra modifiche utente indotta a stato e quelle fatte programmazione?
Domanda
Se mi manca qualcosa o non c'è davvero nessun modo (/ built-in pronto) per modificare a livello di codice lo stato di un QCheckBox senza emettere il "vuoto stateChanged (int stato)" segnale?
Il segnale summenzionato viene emesso indipendentemente "setCheckState vuoto (Qt :: stato CheckState)" è stato chiamato o l'utente cambia lo stato tramite l'interfaccia utente, e non v'è alcun segnale "stateEdited" come con la QLineEdit.
Quindi, se non v'è alcun modo pronto a distinguere tra modifiche programmatiche e user-indotta allo stato della QCheckBox, e le uniche opzioni sono subclassing / aggiungendo il segnale "stateEdited" o giocherellare con i "vuoti QObject :: blockSignals ( blocco bool)", perché ha a che essere così, cioè, è che un (una sorta di) incoerenza (in Qt)?
Soluzione
Se è necessario soltanto per essere informato su input dell'utente, ascoltare |
QAbstractButton::clicked( bool checked );
In caso contrario, la connessione a
QAbstractButton::toggled( bool checked );
o
QCheckBox::stateChanged( int state);
Altri suggerimenti
Un approccio che funziona per tutti i segnali e widget è quello di avvolgere le chiamate ad setChecked()
in un paio di chiamate blockSignals()
:
const bool blocked = but->signalsBlocked();
but->blockSignals( true );
but->setChecked( true );
but->blockSignals( blocked );
o, con qualcosa di ogni programmatore Qt avrà nella sua cassetta degli attrezzi:
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 avrà QSignalBlocker built-in
Se vuoi
programatically cambiare lo stato di un QCheckBox
setCheckState metodo.
P.S. Non capisco che cosa vuol dire
cambiare lo stato di un QCheckBox ... emettendo un "vuoto stateChanged (int stato)" Segnale
Probabilmente si dovrebbe leggere segnali e slot argomento con più attenzione.