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 tuo connect

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.