Problema con segnale che viene emesso più volte
-
Ciao a tutti,
Ho un (nuovo) problema con l’emissione di un segnale.
Ho uno widget (Widget_A) che mi mostra dei valori da un database . Posso avere, ad esempio, 30 valori, ma li visualizzo in gruppi da 5.
Ho inserito due pulsanti Avanti e Indietro per scorrere le pagine in modo da vedere di volta in volta i valori 1…5, 6…10, 11…15, ecc.
La funzione Document non fa altro che selezionare dal database i valori corretti per ogni gruppo visualizzato nella pagina corrente.```void ViewResult::gotonextpage() { currentpage++; Document( currentpage); } void ViewResult::gotoprevpage() { currentpage--; Document(currentpage); }
Fino a qui tutto liscio.
In un altro widget (Widget_B) ho altri due tasti Avanti e Indietro che dovrebbero “aggangiare” i colleghi di Widget_A.void MainScreen::on_previous_button_clicked() { connect (this,SIGNAL(clickprev()),widgetA,SLOT(gotoprevpage())); emit(clickprev()); } void MainScreen::on_next_button_clicked() { connect (this,SIGNAL(clicknext()),widgetA,SLOT(gotonextpage())); emit(clicknext()); }
Succede che:
Premo il tasto avanti, ok va a Pagina 2
Premo il tasto indietro, ok va a Pagina 1
Premo ancora il tasto avanti e va a Pagina 3…
Vado indietro, Pagina1
Clicko su Avanti, pagina 4…
Se passo ad utilizzare i tasti di Widget_A tutto funziona come deve, riprendendo il corretto funzionamento.Pensavo ad un errore nell’assegnazione del valore di pagina (variabile currentpage), invece ho fatto un debug, e ho visto che , all’emissione del segnale (sia per l’avanti che per l’indietro), la funzione viene lanciata due, tre, … n volte a crescere man mano che continuo.
Non credo che l’errore sia nella funzione base (quella di Widget A), che è banale e funziona bene al suo interno.
D’altra parte non capisco cosa possa spingere il segnale a ripetersi come se ci fosse un ciclo while…
Grazie e un saluto a tutti -
connect
crea una nuova connessione tutte le volte che lo chiami. Hai due possibilita':- Sposta i connect nel costruttore di
MainScreen
ivece che negli slot dei pulsanti (fortemente consigliato) - Aggiungi
Qt::UniqueConnection
come quinto argomento al tuoconnect
- Sposta i connect nel costruttore di