Durante l'apprendimento di Qt, mi sono imbattuto in questo problema con un insieme di widget interconnessi che volevo aggiornare "atomicamente". Mi è piaciuta la soluzione di @ cjhuitt, ma ho scoperto che va ancora meglio con un po 'di zucchero sintattico basato su proxy objects. Ecco l'approccio che ho usato ...
In primo luogo, ho definito un modello di classe per un oggetto proxy di blocco. Come Caleb, questo blocca i segnali sulla costruzione, e quindi ripristina il loro stato precedente sulla distruzione.Tuttavia, sovraccarica anche all'operatore ->
per restituire un puntatore all'oggetto bloccato:
template<class T> class Blocker {
T *blocked;
bool previous;
public:
Blocker(T *blocked)
: blocked(blocked),
previous(blocked->blockSignals(true)) {}
~Blocker() { blocked->blockSignals(previous); }
T *operator->() { return blocked; }
};
successiva, ho definito una piccola funzione template per costruire e restituire un Blocker:
template<class T> inline Blocker<T> whileBlocking(T *blocked) {
return Blocker<T>(blocked);
}
Mettendo tutto insieme , userei in questo modo:
whileBlocking(checkBox)->setChecked(true);
o
whileBlocking(xyzzySpin)->setValue(50);
Questo mi ottiene tutti i vantaggi di Raii, con abbinato automaticamente il blocco e ripristinare intorno alla chiamata di metodo, ma non ho bisogno di nominare eventuali bandiere involucro o statali. È bello, facile e dannatamente infallibile.
La disconnessione quindi collegare scenario proposto da liaK sembra meglio di bloccare tutti i segnali per questo compito specifico. – Longfield
@Longfield: Penso che usare il segnale "cliccato" sia il migliore per questo compito specifico. – Job
beh, lo stato potrebbe anche essere modificato dal programma, non necessariamente dall'utente attraverso l'interfaccia utente. Comunque, stiamo parlando di dettagli qui e immagino che metdos abbia trovato una soluzione che gli si addica. – Longfield