Ho ricevuto una classe derivata da QWidget che contiene tre QSpinBox (ad esempio coordinate). Il segnale valueChanged()
è collegato e viene emesso in almeno questi tre casi:Qual è il modo giusto per sopprimere i segnali Qt quando i valori sono impostati in modo esplicito
- su/giù tasto
- inseriti manualmente il numero
setValue()
Tuttavia, quando si utilizza setValue()
, voglio sopprimere il segnale (s), dal momento che non voglio avere (tre) segnali. Nella mia comprensione, ci sono due modi per farlo:
QObject::blockSignals()
- utilizzando un flag che indica se i valori sono stati esplicitamente impostati
entrambe le varianti di lavoro, ma penso che non sono diritti -In avanti affatto: Per il primo, generalmente blocco tutti i segnali E ho bisogno di impostare blockSignals(true)
per tutti i widget underyling (blockSignals non blocca i bambini QObjects nella mia applicazione). Per il secondo, ho bisogno di interrogare il flag in ogni metodo di aggiornamento E i segnali vengono sollevati anche se non ne ho bisogno.
Esistono schemi di progettazione generali che impediscono tale comportamento? In caso contrario, quale variante preferiresti?
Hey Ilya, grazie. Hai assolutamente ragione - questa è la terza (e finora più pulita) variante. Tuttavia, avrei bisogno di reimplementare (una volta) tutti i tipi di widget (il QSpinBox era solo un esempio) - QLineEdit, QComboBox, QDoubleSpinBox, .... – braggPeaks
Non sono sicuro se QLineEdit debba essere reimplementato - poiché QLineEdit ha segnali textChanged (const QString e testo) e textEdited (const QString e testo) che consentono di distinguere tra i tipi di modifiche. Lo stesso potrebbe valere per QComboBox ... –
Funzionerebbe solo quando tutto accade nel thread dell'interfaccia utente. Quando si hanno catene di connessione segnale/slot su più thread, 'valueBeingSet' sarà impostato su' false' prima che il segnale 'valueChnaged 'venga emesso di nuovo (infinitamente), perché il gestore di eventi verrà chiamato in modo asincrono. – fferri