QCheckBox: come differenziare tra modifiche utente indotta a stato e quelle fatte programmazione?

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

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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top